我正在使用keras tensorflow后端,在一个延时体外受精胚胎图像数据集上实现ResNet50+LSTM和注意力模型。
数据集由大约220个样本组成,我使用85%-15%的训练/验证分割(203个用于训练,27个用于验证)。
我的模型能够达到0.80+的训练精度,但验证精度要么停留在0.5左右,要么仅仅停留在0.5,验证损失几乎是训练损失的两倍。
这只是一个过度的问题吗?
如果不是,我如何调试和提高验证集的性能?
我试过的事情:
我试着添加正则化(L1,0.01)/Dropout层(0.5)/reduce the neuron(1024 to 512 to 256),但都不起作用
我还通过减去平均值和除以标准差来规范化我的数据。
我使用的是一个Adam优化器,学习速度为1e-5,体重没有下降。图像在训练前被洗牌。
下面是我的模型和进度条的代码
进度条:
纪元1/40
150/150[========]-28s 189ms/步-损耗:2.1318-acc:0.5267-val椀u损耗:4.8806-val椀u acc:0.5556
Epoch 00001:valúu损耗从inf提高到4.88055,将模型保存到result/resnetmodel.hdf5
纪元2/40
150/150[========]-14s 94ms/步-损耗:1.9957-acc:0.5867-valu损耗:4.8210-valu acc:0.5000
Epoch 00002:valúu损耗从4.88055提高到4.82100,将模型保存到result/resnetmodel.hdf5
纪元3/40
150/150[=========]-14s 94ms/步-损耗:1.8062-acc:0.6200-valu损耗:4.9689-valu acc:0.5000
第00003号时代:瓦卢损失没有从4.82100改善
纪元4/40
150/150[========]-14s 91ms/步-损耗:1.7516-acc:0.6267-valu损耗:5.0284-valu acc:0.5000
纪元00004:valçu损失没有从4.82100改善
纪元5/40
150/150[========]-14s 94ms/步-损耗:1.6508-acc:0.7000-val戋u损耗:4.9873-val戋u acc:0.4444
纪元00005:valçu损失没有从4.82100改善
纪元6/40
150/150[=========]-14s 92ms/步-损耗:1.5003-acc:0.7733-valu损耗:4.9800-valu acc:0.4444
纪元00006:valçu损失没有从4.82100改善
纪元7/40
150/150[========]-14s 96ms/步-损耗:1.4614-acc:0.7667-val戋u损耗:4.9435-val戋u acc:0.5000
纪元00007:valçu损失没有从4.82100改善
纪元8/40
150/150[========]-14s 90ms/步-损耗:1.5480-acc:0.6800-val戋u损耗:4.9345-val戋u acc:0.5000
纪元00008:valçu损失没有从4.82100改善
纪元9/40
150/150[========]-14s 93ms/步-损耗:1.4334-acc:0.7667-val戋u损耗:5.0452-val戋u acc:0.5000
纪元00009:valçu损失没有从4.82100改善
纪元10/40
150/150[=======]-14s 94ms/步-损耗:1.4344-acc:0.7667-valu损耗:5.1768-valu acc:0.4444
纪元00010:瓦卢损失没有从4.82100改善
纪元11/40
150/150[=========]-15s 98ms/步-损耗:1.3369-acc:0.8533-valu损耗:5.1331-valu acc:0.4444
时代00011:瓦卢损失没有从4.82100改善
纪元12/40
150/150[=========]-14s 93ms/步-损耗:1.2834-acc:0.8133-valu损耗:5.1265-valu acc:0.4444
时代00012:瓦卢损失没有从4.82100改善
纪元13/40
150/150[========]-14s 91ms/步-损耗:1.3007-acc:0.8200-val戋u损耗:5.1941-val戋u acc:0.4444
纪元00013:瓦卢损失没有从4.82100改善
纪元14/40
150/150[========]-14s 94ms/步-损耗:1.2358-acc:0.8533-valèu损耗:5.3716-valèu acc:0.4444
时代00014:瓦卢损失没有从4.82100改善
纪元15/40
150/150[========]-14s 92ms/步-损耗:1.2823-acc:0.8000-valu损耗:5.3877-valu acc:0.4444
纪元00015:瓦卢损失没有从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 =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)

最佳答案

数据集由大约220个样本组成,我使用85%-15%的训练/验证分割(203个用于训练,27个用于验证)。
这只是一个过度的问题吗?
听起来很有可能,是的。对于这样一个深度网络,220个样本是非常小的数据集。从这么小的一组数据中很难学会很好地概括。
如果不是,我如何调试和提高验证集的性能?
在一个理想的世界中,再获取大约100000个样本并将它们添加到您的数据集中!
接受这一点可能不切实际,你可以尝试以下一种或多种策略:
使用image augmentation人工增加数据集的大小
而不是试图从零开始训练一个深度网络。使用tensorflow_集线器进行调查,以便只训练最后一层(和/或微调)预先训练的网络(link)。

关于python - 训练准确性有所提高,但验证准确性仍为0.5,并且模型预测每个验证样本的类别几乎相同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57469505/

10-12 22:14