machine-learning - 迁移学习 - 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
解决方案
可能是您的辍学率过高的结果。你没有显示你的数据生成器,所以我不知道那里是否有问题,但我怀疑你需要编译使用
loss='sparse_categorical_crossentropy'
推荐阅读
- node.js - Chai POST 请求测试不发送电子邮件
- python - Python - 从任何字符串 bsp.("aa;l sd20.10.1980adgf") 获取日期 dd.mm.yyyy
- php - 无法从服务器上传到 PHP 中的 FTP 服务器,但可以在另一台服务器上工作
- .net - dotnet publish 不使用 dotnet restore 恢复的版本
- java - Spring JPQL 用于字符串数组作为可选参数
- arrays - 优化 GAE Datastore 查询重复字段
- php - 在 PHP 中服务 WOFF 文件时出错 - file_get_contents 与 readfile
- javascript - 当我将要呈现的组件分离到另一个页面时,导航不起作用
- excel - 使用 VLOOKUP 在 Excel 中查找部分匹配项
- postgresql - 在 PostgreSQL 中删除临时表?