数据集包含约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)
答案 0 :(得分:0)
数据集包含约220个样本,我使用的训练/验证比例为85%-15%(训练中为203,验证中为27)。
这只是一个过度拟合的问题吗?
听起来很可能,是的。对于这样一个深度网络,220个样本是非常小的数据集。真的不可能从这么少的数据中学会很好地概括。
如果没有,我该如何调试和提高验证集的性能?
在理想世界中,再获取100,000个左右的样本并将其添加到您的数据集中!
接受这可能是不切实际的,您可以尝试以下一种或多种策略:
答案 1 :(得分:0)
我遇到了同样的问题:
ImageDataGenerator from keras.preprocessing.image
即时执行图像增强我仍然得到 0.5 val_loss。 这解决了我的情况,希望对您有所帮助:
替换model = Model(inputs = x, outputs = prediction)
与
model = Model(inputs = x.inputs, outputs = prediction)