首页 > 解决方案 > 为什么我的神经网络不学习

问题描述

我有一个我正在尝试训练的 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)

这是训练和验证损失的图

标签: tensorflowneural-networkkeras

解决方案


由于多种原因,网络可能无法融合/学习,但这里列出了我认为与您的案例相关的提示(根据我自己的经验):

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

  • 训练步骤:对于优化器,我建议先使用 Adam 并改变学习率以查看损失如何响应。此外,由于您使用的是卷积层,您应该考虑添加批量归一化层,这可以显着加快训练时间,并将卷积激活更改为“relu”,这使得它们的训练速度更快。

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

  • 训练/测试拆分:我看到您在测试集中使用了 8360 个观察值。鉴于您的训练集的大小,我认为它太多了。例如1000就足够了。您拥有的训练样本越多,您的结果就越令人满意。

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


推荐阅读