为什么我的val_loss下降了,但是我的val_accuracy却停滞了

时间:2020-05-10 17:55:18

标签: python keras

所以我用数据集训练我的模型,对于每个时期,我可以看到lossval_loss下降了(重要的是要注意val_loss会下降到一定程度点,但随后也停滞不前,略有起伏)和accuracy上升,但由于某种原因,我的val_accuracy保持在0.33左右。 我浏览了此文件,这似乎是一个过拟合的问题,因此我在模型的某些层上使用了Dropout并添加了l2层和正则化,但这似乎没有效果。因此,我想问你,为了使val_loss持续下降,而val_accuracy不会停滞并因此持续上升,您认为我可以在模型中进行哪些改进?

我尝试使用更多的图像,但问题似乎相同。。不确定我的图像增量是否足够。

是否应该在Dropout层中添加Conv2D层? 我应该使用更少还是更多的l2正则化? 我应该使用更多图像吗? 只是一些可能与我的问题有关的问题。

我的模特在下面:

model = Sequential()
model.add(Conv2D(16, kernel_size=(3, 3), input_shape=(580, 360, 1), padding='same', activation='relu'))
model.add(BatchNormalization())

model.add(Conv2D(16, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.05)))
model.add(BatchNormalization())

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.05)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.02)))
model.add(BatchNormalization())

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.02)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.05)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))


model.add(Flatten())  # Flattening the 2D arrays for fully connected layers

model.add(Dense(532, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(266, activation='softmax'))
model.add(Reshape((7, 38)))

print(model.summary())
optimizer = keras.optimizers.SGD(lr=0.00001)
model.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])

谢谢!

PS:这是训练图:

enter image description here

PS2:培训到此结束:

209/209 [==============================] - 68s 327ms/step - loss: 0.7421 - accuracy: 0.9160 - val_loss: 3.8159 - val_accuracy: 0.3152
Epoch 40/40

2 个答案:

答案 0 :(得分:2)

这似乎是一个经典的过拟合问题。

最好对问题进行更详细的介绍,例如分类任务吗?您的图像是灰度的吗?该网络的目的是什么?

有了这些信息,我想说对网络进行任何适当的规范化都应该有所帮助。您可以尝试的某些项目:

  • 对于转换层,我建议使用SpatialDropout layers
  • 获取更多数据(如果可能)
  • 使用数据扩充(如果可能)
  • 提高辍学率
  • 尝试降低模型架构的复杂性(也许更少的层,通常更少的过滤器,密集层中的神经元数量等)

希望这会有所帮助!

答案 1 :(得分:1)

只是一个提示:

您的CNN架构存在问题,每次卷积的大小都必须越来越小,但随着情况的发展,它会越来越大:您拥有16、32、64、64、128。应该相反地进行操作方式。从input_shape =(580,360)开始,然后您可能会说,让我们说一下Conv2D的形状256、128、64、32。