【发布时间】: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