所以我用数据集训练我的模型,对于每个时期,我可以看到loss
和val_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:这是训练图:
PS2:培训到此结束:
209/209 [==============================] - 68s 327ms/step - loss: 0.7421 - accuracy: 0.9160 - val_loss: 3.8159 - val_accuracy: 0.3152
Epoch 40/40
答案 0 :(得分:2)
这似乎是一个经典的过拟合问题。
最好对问题进行更详细的介绍,例如分类任务吗?您的图像是灰度的吗?该网络的目的是什么?
有了这些信息,我想说对网络进行任何适当的规范化都应该有所帮助。您可以尝试的某些项目:
希望这会有所帮助!
答案 1 :(得分:1)
只是一个提示:
您的CNN架构存在问题,每次卷积的大小都必须越来越小,但随着情况的发展,它会越来越大:您拥有16、32、64、64、128。应该相反地进行操作方式。从input_shape =(580,360)开始,然后您可能会说,让我们说一下Conv2D的形状256、128、64、32。