首页 > 解决方案 > 迁移学习 - Val_loss 奇怪的行为

问题描述

我正在尝试在 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 和准确度的一些图片: 2 个密集层,有 16 个和 8 个神经元,lr = 0.001,衰减 1e-6,batchsize = 25

标签: machine-learningdeep-learningconv-neural-networkimage-recognitiontransfer-learning

解决方案


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

loss='sparse_categorical_crossentropy'

推荐阅读