为什么我的神经网络无法学习

时间:2018-07-03 14:02:05

标签: tensorflow neural-network keras

我有一个要训练的CNN,我不知道为什么它没有学习。它有32个类别,分别是不同类型的衣服,每个文件夹中约有1000张图像。

问题是这是训练结束时的结果,在我的GPU上大约需要9个小时

损耗:3.3403-acc:0.0542-val_loss:3.3387-val_acc:0.0534

如果有人能指导我如何使这个网络更好地训练,我将不胜感激。

# dimensions of our images.
img_width, img_height = 228, 228

train_data_dir = 'Clothes/train'
validation_data_dir = 'Clothes/test'
nb_train_samples = 25061
nb_validation_samples = 8360
epochs = 20
batch_size = 64

if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)

model = Sequential()
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='tanh', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.3))
model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='tanh'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(32, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

[test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle = True)

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle = True)

history = model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

Here is the plot of the training & validation loss

2 个答案:

答案 0 :(得分:1)

由于某些原因,网络可能无法融合/学习,但这是我认为与您的情况相关的提示列表(根据我的经验):

  • 转移学习:您应该知道的第一件事是,对于大多数问题,从头开始训练图像分类器非常困难,您需要更多的计算能力和时间。我强烈建议您使用转学。 Keras中提供了多种训练有素的体系结构,您可以将它们用作网络的初始权重(或其他方法)。

  • 培训步骤:对于优化工具,我建议先使用Adam,然后更改学习率以了解损失的响应方式。另外,由于您正在使用卷积层,因此应考虑添加批处理归一化层,这可以显着缩短训练时间,并将卷积激活更改为“ relu”,从而使它们的训练速度更快。

    您也可以尝试降低Dropout值,但我认为这不是主要问题。另外,如果您正在考虑从头开始培训网络, 您应该从更少的层开始,然后逐渐增加,以更好地了解正在发生的事情。

  • 训练/测试组:我发现您在测试集中使用了8360个观测值。考虑到您的培训课程规模,我认为这太多了。例如1000就足够了。您拥有的培训样本越多,您的结果就会越令人满意。

此外,在判断模型的准确性之前,您应该首先建立一个基准模型来对模型进行基准测试。基线模型取决于您的问题,但总的来说,我选择一种模型来预测数据集中最常见的类。您还应该查看Keras中可用的另一个度量“ top_k_accuracy”,当您要预测的类别相对较多时,这很有趣。它可以帮助您了解模型与正确的预测有多接近。

答案 1 :(得分:0)

首先,为了保持理智,请仔细检查是否有任何错误,以及是否按计划发送了数据

您可能想添加Top K准确性度量标准,以更好地了解它是接近实现还是完全错误。

这里有一些调整的尝试:

将内核大小更改为3,并激活为relu

model.add(Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))

如果您认为模型不合适,请尝试从每个池开始增加Conv层数。但是您也可以增加过滤器数量或conv +池重复次数。

Adam优化程序的学习速度可能比RMS属性快

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

最大的改进可能是获取更多数据。我认为您的数据集对于问题的范围可能太小了。 您可能要尝试从预先训练的图像识别网络进行转移学习。