训练准确性有所提高,但验证准确性仍保持在0.5,并且模型预测每个验证样本的类别几乎相同

时间:2019-08-12 23:42:58

标签: 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)/减少神经元(1024到512到256),但是它们都不起作用)

我还通过减去平均值并除以标准差对数据进行归一化。

我正在使用学习速度为1e-5的Adam优化器,而不会降低重量。图像在训练之前会被随机播放。

下面是我的模型的代码和进度条

进度栏:

第1/40集

150/150 [=============================]-28s 189ms / step-损失:2.1318-acc: 0.5267-val_loss:4.8806-val_acc:0.5556

Epoch 00001:val_loss从inf改进为4.88055,将模型保存到result / resnetmodel.hdf5

第2/40集

150/150 [=============================]-14s 94ms / step-损失:1.9957-acc: 0.5867-val_loss:4.8210-val_acc:0.5000

Epoch 00002:val_loss从4.88055改进为4.82100,将模型保存到result / resnetmodel.hdf5

第3/40集

150/150 [==============================]-14s 94ms / step-损失:1.8062-acc: 0.6200-val_loss:4.9689-val_acc:0.5000

Epoch 00003:val_loss从4.82100没有改善

第4/40集

150/150 [==============================]-14s 91ms / step-损耗:1.7516-acc: 0.6267-val_loss:5.0284-val_acc:0.5000

第00004集:val_loss从4.82100没有改善

第5/40集

150/150 [=============================]-14s 94ms / step-损失:1.6508-acc: 0.7000-val_loss:4.9873-val_acc:0.4444

Epoch 00005:val_loss从4.82100没有改善

第6/40版

150/150 [==============================]-14s 92ms / step-损失:1.5003-acc: 0.7733-val_loss:4.9800-val_acc:0.4444

第00006集:val_loss从4.82100开始没有改善

Epoch 7/40

150/150 [==============================]-14s 96ms / step-损失:1.4614-acc: 0.7667-val_loss:4.9435-val_acc:0.5000

第00007集:val_loss从4.82100开始没有改善

Epoch 8/40

150/150 [==============================]-14s 90ms / step-损失:1.5480-acc: 0.6800-val_loss:4.9345-val_acc:0.5000

第00008集:val_loss从4.82100没有改善

第9/40版

150/150 [==============================]-14s 93ms / step-损失:1.4334-acc: 0.7667-val_loss:5.0452-val_acc:0.5000

第00009集:val_loss从4.82100开始没有改善

第10/40集

150/150 [=============================]-14s 94ms / step-损失:1.4344-acc: 0.7667-val_loss:5.1768-val_acc:0.4444

Epoch 00010:val_loss从4.82100没有改善

Epoch 11/40

150/150 [=============================]-15s 98ms / step-损失:1.3369-acc: 0.8533-val_loss:5.1331-val_acc:0.4444

第00011集:val_loss从4.82100没有改善

第12/40集

150/150 [==============================]-14s 93ms / step-损失:1.2834-acc: 0.8133-val_loss:5.1265-val_acc:0.4444

第00012集:val_loss从4.82100开始没有改善

第13/40集

150/150 [=============================]-14s 91ms / step-损失:1.3007-acc: 0.8200-val_loss:5.1941-val_acc:0.4444

Epoch 00013:val_loss从4.82100没有改善

第14/40集

150/150 [=============================]-14s 94ms / step-损失:1.2358-acc: 0.8533-val_loss:5.3716-val_acc:0.4444

第00014集:val_loss从4.82100开始没有改善

第15/40集

150/150 [=============================]-14s 92ms / step-损失:1.2823-acc: 0.8000-val_loss:5.3877-val_acc:0.4444

第00015集:val_loss从4.82100开始没有改善

第00015版:提前停止

评估:----加载数据

---- prediction_on_eval -----

事实= [1。 0。],Predicted = [0.03809702 0.96190304]

事实= [1。 0。],Predicted = [0.9803326 0.0196674]

事实= [1。 0。],Predicted = [9.9986279e-01 1.3717638e-04]

事实= [1。 0。],Predicted = [0.98158103 0.01841903]

事实= [1。 0。],Predicted = [0.99492776 0.00507224]

事实= [1。 0。],Predicted = [0.70435154 0.29564843]

事实= [1。 0。],Predicted = [4.1277369e-04 9.9958724e-01]

事实= [1。 0。],Predicted = [0.9818978 0.01810225]

事实= [1。 0。],Predicted = [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 =Input(shape = (40, config.img_shape, config.img_shape, config.img_channel))

if config.base_model == "inception_v3":

    cnn = InceptionV3(weights = None, include_top=False, pooling = "avg")

elif config.base_model == 'ResNet50':

    cnn = ResNet50(weights = None, include_top=False, pooling = "avg")

cnn.load_weights(config.pretrained_path)

for layer in cnn.layers:

    layer.trainable = False


extracted_features = TimeDistributed(cnn)(x)

activations = Bidirectional(LSTM(config.num_units_lstm, return_sequences=True,                              recurrent_activation = 'relu', recurrent_initializer = 'glorot_uniform', name='Bidirectional_LSTM'))(extracted_features)

activations = Dropout(0.5)(activations)

attention = TimeDistributed(Dense(1, activation='tanh'),name = "context_vector")(activations)

attention = Flatten()(attention)

attention = Activation('softmax', name = "conext_weights")(attention)

attention = RepeatVector(config.num_units_lstm*2)(attention)

attention = Permute([2, 1])(attention)

sent_representation = merge.multiply([activations, attention])

sent_representation = Lambda(lambda xin: K.sum(xin, axis=1))(sent_representation)

sent_representation = BatchNormalization()(sent_representation)

prediction = Dense(config.num_classes, activation = 'softmax')(sent_representation)

model =  Model(inputs = x, outputs = prediction)

2 个答案:

答案 0 :(得分:0)

  

数据集包含约220个样本,我使用的训练/验证比例为85%-15%(训练中为203,验证中为27)。

     

这只是一个过度拟合的问题吗?

听起来很可能,是的。对于这样一个深度网络,220个样本是非常小的数据集。真的不可能从这么少的数据中学会很好地概括。

  

如果没有,我该如何调试和提高验证集的性能?

在理想世界中,再获取100,000个左右的样本并将其添加到您的数据集中!

接受这可能是不切实际的,您可以尝试以下一种或多种策略:

  • 使用image augmentation人为地增加数据集的大小
  • 而不是尝试从头开始训练深层网络。使用tensorflow_hub进行调查,以便仅训练(或微调)预训练网络(link)的最后一层。

答案 1 :(得分:0)

我遇到了同样的问题:

  • 使用 ImageDataGenerator from keras.preprocessing.image 即时执行图像增强
  • 使用具有预训练权重的迁移学习、VGG16 和 MobileNetV2 等

我仍然得到 0.5 val_loss。 这解决了我的情况,希望对您有所帮助:

替换model = Model(inputs = x, outputs = prediction)
model = Model(inputs = x.inputs, outputs = prediction)