【问题标题】:Transfer Learning - Val_loss strange behaviour迁移学习 - Val_loss 奇怪的行为
【发布时间】:2019-10-19 04:44:54
【问题描述】:

我正在尝试在 phyton 中的 keras.application 在 MobileNetV2 上使用迁移学习。 我的图像属于 4 类,第一类、第二类、第三类和最后一类分别有 8000、7000、8000 和 8000 个图像。我的图像是灰度的,并从 1024x1024 调整为 128x128。

我从 MobileNetV2 中删除了分类密集层并添加了我自己的密集层:

global_average_pooling2d_1 (Glo Shape = (None, 1280)         0 Parameters                            
______________________________________________________________________________
dense_1 (Dense)                 Shape=(None, 4)            5124 Parameters      
______________________________________________________________________________
dropout_1 (Dropout)             Shape=(None, 4)            0  Parameters                        
________________________________________________________________
dense_2 (Dense)                 Shape=(None, 4)            20 Parameters                         
__________________________________________________________________________
dense_3 (Dense)                 Shape=(None, 4)            20 Parameters                        

Total params: 2,263,148

Trainable params: 5,164

Non-trainable params: 2,257,984

如您所见,我添加了 2 个带 dropout 的密集层作为正则化器。 此外,我使用了以下

opt = optimizers.SGD(lr=0.001, decay=4e-5, momentum=0.9)

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

batch_size = 32

我的训练结果很奇怪...:

时代

1 损失:1.3378 - acc:0.3028 - val_loss:1.4629 - val_acc:0.2702

2 损失:1.2807 - acc:0.3351 - val_loss:1.3297 - val_acc:0.3208

3 损失:1.2641 - acc:0.3486 - val_loss:1.4428 - val_acc:0.3707

4 损失:1.2178 - acc:0.3916 - val_loss:1.4231 - val_acc:0.3758

5 损失:1.2100 - acc:0.3909 - val_loss:1.4009 - val_acc:0.3625

6 损失:1.1979 - acc:0.3976 - val_loss:1.5025 - val_acc:0.3116

7 损失:1.1943 - acc:0.3988 - val_loss:1.4510 - val_acc:0.2872

8 损失:1.1926 - acc:0.3965 - val_loss:1.5162 - val_acc:0.3072

9 损失:1.1888 - acc:0.4004 - val_loss:1.5659 - val_acc:0.3304

10 损失:1.1906 - acc:0.3969 - val_loss:1.5655 - val_acc:0.3260

11 损失:1.1864 - acc:0.3999 - val_loss:1.6286 - val_acc:0.2967

(...)

综上所述,训练的损失不再减少,仍然很高。该模型也过拟合。 你可能会问为什么我只添加了 2 个密集层,每层有 4 个神经元。一开始我尝试了不同的配置(例如 128 个神经元和 64 个神经元以及不同的调节器),然后过度拟合是一个巨大的问题,即训练的准确率几乎是 1,而测试的损失仍然远离 0。

我有点搞不懂这是怎么回事,因为这里出了点大问题。

微调尝试: 分类部分的密集层中不同数量的神经元从 1024 到 4 不等。 不同的学习率(0.01、0.001、0.0001) 不同的批量大小(16,32,64) 不同的调节器 L1 与 0.001, 0.0001

结果: 总是巨大的过拟合

base_model = MobileNetV2(input_shape=(128, 128, 3), weights='imagenet', include_top=False)

# define classificator
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(4, activation='relu')(x)
x = Dropout(0.8)(x)
x = Dense(4, activation='relu')(x)
preds = Dense(4, activation='softmax')(x) #final layer with softmax activation

model = Model(inputs=base_model.input, outputs=preds)

for layer in model.layers[:-4]:
    layer.trainable = False

opt = optimizers.SGD(lr=0.001, decay=4e-5, momentum=0.9)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])

batch_size = 32
EPOCHS = int(trainY.size/batch_size)

H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=EPOCHS, batch_size=batch_size)

结果应该是没有过拟合且 val_loss 接近 0。我从一些研究类似图像集的论文中知道这一点。

更新: 下面是一些val_loss、train_loss和accuracy的图片: 2 dense layers with 16 and 8 neurons, lr =0.001 with decay 1e-6, batchsize=25

【问题讨论】:

  • 您链接的图像的结果对我来说看起来还不错。看起来像当一个通用模型被训练并达到容量时。但我假设只有当你将神经元数量增加到超过 16/8 时才会开始发生过度拟合?您正在做的图像尺寸缩小可能非常重要。确定你没有使用太多细节?
  • 既然你用的是GlobalAveragePooling,那么大的尺寸缩小有必要吗?

标签: machine-learning deep-learning conv-neural-network image-recognition transfer-learning


【解决方案1】:

可能是因为您的辍学率过高。你没有显示你的数据生成器,所以我不知道那里是否有问题,但我怀疑你需要编译使用

loss='sparse_categorical_crossentropy'

【讨论】:

    【解决方案2】:

    我不确定上面的错误是什么,但我知道如何解决它。我完全训练了预训练的网络(以及一个具有 4 个神经元和 softmax 的密集层)。结果非常令人满意。 我还在 VGG16 上进行了测试,我只训练了密集输出层,它完全运行良好。

    似乎 MobileNetV2 学习了我的数据集不希望出现的特征。我的数据集是雷达图像,看起来非常人工(“LPI”信号的choi williams 分布)。另一方面,这些图像非常简单(它们基本上只是灰度图像中的边缘),所以我仍然不知道为什么基于模型的迁移学习不适用于 MobileNetV2)。

    【讨论】:

      【解决方案3】:

      在这里,您使用 x = Dropout(0.8)(x) 这意味着下降 80% 但我认为你需要 20% 所以用x = Dropout(0.2)(x)替换它

      另外,如果需要,请通过keras documentation 进行相同的操作。

      上述文档的摘录

      keras.layers.Dropout(rate, noise_shape=None, seed=None)

      rate:在 0 和 1 之间浮动。要丢弃的输入单位的分数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-01
        • 1970-01-01
        • 2017-09-14
        • 2020-05-13
        • 2018-10-04
        • 2019-12-17
        • 1970-01-01
        • 2014-02-19
        相关资源
        最近更新 更多