Python 训练精度提高,但验证精度保持在0.5,模型预测每个验证样本的等级几乎相同
我正在使用keras tensorflow后端在延时IVF胚胎图像数据集上实现ResNet50+LSTM和注意模型 数据集由大约220个样本组成,我使用85%-15%的训练/验证分割(203个用于训练,27个用于验证) 我的模型能够达到0.80+的训练精度,但验证精度要么停留在0.5左右,要么保持在0.5左右,验证损失几乎是训练损失的两倍 这仅仅是一个过度合身的问题吗 如果没有,我如何调试和改进验证集的性能 #我尝试过的事情: 我尝试添加正则化(L1,0.01)/退出层(0.5)/减少神经元(1024到512到256),但没有一个有效) 我还通过减去平均值和除以标准差来规范化我的数据 我使用的是Adam优化器,学习速度为1e-5,没有重量衰减。训练前,图像被洗牌 #下面是我的模型和进度条的代码 #进度条:Python 训练精度提高,但验证精度保持在0.5,模型预测每个验证样本的等级几乎相同,python,tensorflow,keras,deep-learning,classification,Python,Tensorflow,Keras,Deep Learning,Classification,我正在使用keras tensorflow后端在延时IVF胚胎图像数据集上实现ResNet50+LSTM和注意模型 数据集由大约220个样本组成,我使用85%-15%的训练/验证分割(203个用于训练,27个用于验证) 我的模型能够达到0.80+的训练精度,但验证精度要么停留在0.5左右,要么保持在0.5左右,验证损失几乎是训练损失的两倍 这仅仅是一个过度合身的问题吗 如果没有,我如何调试和改进验证集的性能 #我尝试过的事情: 我尝试添加正则化(L1,0.01)/退出层(0.5)/减少神经元(1
Epoch 1/40
150/150 [==============================] - 28s 189ms/step - loss: 2.1318 - acc: 0.5267 - val_loss: 4.8806 - val_acc: 0.5556
Epoch 00001: val_loss improved from inf to 4.88055, saving model to result/resnetmodel.hdf5
Epoch 2/40
150/150 [==============================] - 14s 94ms/step - loss: 1.9957 - acc: 0.5867 - val_loss: 4.8210 - val_acc: 0.5000
Epoch 00002: val_loss improved from 4.88055 to 4.82100, saving model to result/resnetmodel.hdf5
Epoch 3/40
150/150 [==============================] - 14s 94ms/step - loss: 1.8062 - acc: 0.6200 - val_loss: 4.9689 - val_acc: 0.5000
Epoch 00003: val_loss did not improve from 4.82100
Epoch 4/40
150/150 [==============================] - 14s 91ms/step - loss: 1.7516 - acc: 0.6267 - val_loss: 5.0284 - val_acc: 0.5000
Epoch 00004: val_loss did not improve from 4.82100
Epoch 5/40
150/150 [==============================] - 14s 94ms/step - loss: 1.6508 - acc: 0.7000 - val_loss: 4.9873 - val_acc: 0.4444
Epoch 00005: val_loss did not improve from 4.82100
Epoch 6/40
150/150 [==============================] - 14s 92ms/step - loss: 1.5003 - acc: 0.7733 - val_loss: 4.9800 - val_acc: 0.4444
Epoch 00006: val_loss did not improve from 4.82100
Epoch 7/40
150/150 [==============================] - 14s 96ms/step - loss: 1.4614 - acc: 0.7667 - val_loss: 4.9435 - val_acc: 0.5000
Epoch 00007: val_loss did not improve from 4.82100
Epoch 8/40
150/150 [==============================] - 14s 90ms/step - loss: 1.5480 - acc: 0.6800 - val_loss: 4.9345 - val_acc: 0.5000
Epoch 00008: val_loss did not improve from 4.82100
Epoch 9/40
150/150 [==============================] - 14s 93ms/step - loss: 1.4334 - acc: 0.7667 - val_loss: 5.0452 - val_acc: 0.5000
Epoch 00009: val_loss did not improve from 4.82100
Epoch 10/40
150/150 [==============================] - 14s 94ms/step - loss: 1.4344 - acc: 0.7667 - val_loss: 5.1768 - val_acc: 0.4444
Epoch 00010: val_loss did not improve from 4.82100
Epoch 11/40
150/150 [==============================] - 15s 98ms/step - loss: 1.3369 - acc: 0.8533 - val_loss: 5.1331 - val_acc: 0.4444
Epoch 00011: val_loss did not improve from 4.82100
Epoch 12/40
150/150 [==============================] - 14s 93ms/step - loss: 1.2834 - acc: 0.8133 - val_loss: 5.1265 - val_acc: 0.4444
Epoch 00012: val_loss did not improve from 4.82100
Epoch 13/40
150/150 [==============================] - 14s 91ms/step - loss: 1.3007 - acc: 0.8200 - val_loss: 5.1941 - val_acc: 0.4444
Epoch 00013: val_loss did not improve from 4.82100
Epoch 14/40
150/150 [==============================] - 14s 94ms/step - loss: 1.2358 - acc: 0.8533 - val_loss: 5.3716 - val_acc: 0.4444
Epoch 00014: val_loss did not improve from 4.82100
Epoch 15/40
150/150 [==============================] - 14s 92ms/step - loss: 1.2823 - acc: 0.8000 - val_loss: 5.3877 - val_acc: 0.4444
纪元00015:val_损失没有从4.82100改善
纪元00015:提前停止
评估:-加载数据
----基于评估的预测-----
事实=[1.0.],预测=[0.03809702 0.96190304]
事实=[1.0.],预测=[0.9803326 0.0196674]
事实=[1.0.],预测=[9.9986279e-01 1.3717638e-04]
事实=[1.0.],预测=[0.98158103 0.01841903]
事实=[1.0.],预测=[0.99492776 0.00507224]
事实=[1.0.],预测=[0.70435154 0.29564843]
事实=[1.0.],预测=[4.1277369e-04 9.9958724e-01]
事实=[1.0.],预测=[0.9818978 0.01810225]
事实=[1.0.],预测=[0.91195923 0.08804072]
事实=[0.1.],预测=[0.986312 0.013688]
事实=[0.1.],预测=[0.9985434 0.00145668]
事实=[0.1.],预测=[0.80424094 0.195759]
事实=[0.1.],预测=[0.9214819 0.07851809]
事实=[0.1.],预测=[0.03754392 0.96245605]
事实=[0.1.],预测=[9.9976009e-01 2.3989924e-04]
事实=[0.1.],预测=[0.98681134 0.01318868]
事实=[0.1.],预测=[0.9984666 0.0015334]
事实=[0.1.],预测=[0.7229417 0.27705824]
#这是我的模型:
x=输入(形状=(40,config.img\u形状,config.img\u形状,config.img\u通道))
如果config.base_model==“inception_v3”:
cnn=InceptionV3(权重=None,include\u top=False,pooling=“avg”)
elif config.base_model=='ResNet50':
cnn=ResNet50(权重=None,包括_top=False,pooling=“avg”)
cnn.加载权重(配置预训练路径)
对于cnn.layers中的层:
layer.trainable=错误
提取的特征=时间分布(cnn)(x)
激活=双向(LSTM(config.num\u units\u LSTM,return\u sequences=True,recurrent\u activation='relu',recurrent\u initializer='glorot\u uniform',name='Bidirectional\u LSTM'))(提取的特征)
激活=辍学(0.5)(激活)
注意=时间分布(密集(1,activation='tanh'),name=“context\u vector”)(激活)
注意=展平()(注意)
注意=激活('softmax',name=“conext\U权重”)(注意)
注意=RepeatVector(config.num_unitslstm*2)(注意)
注意=排列([2,1])(注意)
sent_representation=merge.multiply([激活,注意])
发送表示法=λ(λxin:K.sum(xin,轴=1))(发送表示法)
sent_表示法=BatchNormalization()(sent_表示法)
预测=密集(config.num_类,激活='softmax')(已发送_表示)
模型=模型(输入=x,输出=预测)
数据集由大约220个样本组成,我使用85%-15%的训练/验证分割(203个用于训练,27个用于验证)
这仅仅是一个过度合身的问题吗
听起来很有可能,是的。对于这样一个深度网络,220个样本是非常非常小的数据集。从这么小的一组数据中学习如何很好地概括是不太可能的
如果没有,我如何调试和改进验证集的性能
在理想情况下,再抓取10万个左右的样本,并将它们添加到数据集中
接受这一点可能是不切实际的,您可以尝试以下一种或多种策略:
- 用于人为增加数据集的大小
- 而不是从零开始训练深层网络。使用tensorflow_hub进行调查,以便只训练最后一层(和或微调)预先训练的网络()
- 使用keras.preprocessing.image中的
ImageDataGenerator动态执行图像增强
- 使用转移学习、VGG16和MobileNetV2等,并预先训练权重
- 我也遇到了同样的问题:
model=model(输入=x,输出=预测)
使用模型=模型(输入=x.输入,输出=预测)