转移学习-Val_loss异常行为

时间:2019-06-03 15:41:26

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

我正在尝试从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) 具有0.001、0.0001的不同调节器L1

结果: 总是过大的过拟合

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 dense layers with 16 and 8 neurons, lr =0.001 with decay 1e-6, batchsize=25

3 个答案:

答案 0 :(得分:0)

这里,您曾经 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之间浮动。要降低的输入单位的比例。

答案 1 :(得分:0)

我不确定上面的错误是什么,但是我知道如何解决。我完全训练了预训练的网络(还有一个带有4个神经元和softmax的致密层)。结果不仅仅令人满意。 我还在VGG16上进行了测试,在那里我只训练了密集的输出层,并且完全可以正常工作。

似乎MobileNetV2学习了我的数据集所不希望的功能。我的数据集是雷达图像,看起来非常虚假(“ LPI”信号的彩虹分布)。另一方面,这些图像非常容易(它们基本上只是灰度图像中的边缘),所以我仍然不知道为什么基于模型的传输学习不适用于MobileNetV2。

答案 2 :(得分:0)

可能是辍学率很高的结果。您没有显示数据生成器,所以我无法确定那里是否存在问题,但是我怀疑您需要使用进行编译

loss='sparse_categorical_crossentropy'