如果使用下述代码,如果使用Dropout层,会导致准确率极低,是过拟合的现象。注释掉之后,可以得到准确率较高的模型,准确率曲线如下图。
原因: 还未找到原因
x = keras.layers.Conv2D(16,kernel_size=(3,3),strides=(1,1), padding='same',dilation_rate=(1,1),activation='relu')(inputs)
# x = keras.layers.Dropout(0.5)(x)
x = keras.layers.MaxPooling2D((2,2),2)(x)
x = keras.layers.Conv2D(32,(3,3),activation='relu')(x)
# x = keras.layers.Dropout(0.5)(x)
x = keras.layers.MaxPooling2D((2,2), 2)(x)
x = keras.layers.Conv2D(64,(3,3),activation='relu')(x)
# x = keras.layers.Dropout(0.5)(x)
后续:导致准确率低的原因
原因1:图像数据未进行归一化
train_images, test_images = train_images / 255.0, test_images / 255.0
原因2:在CNN模型中使用 Dropout,通常建议在全连接层之后使用它,因为这些层通常包含最多的参数。例如,您可以在 Flatten 层之后和第一个 Dense 层之前添加 Dropout,如下所示:
x = keras.layers.Flatten()(x)
x = keras.layers.Dropout(0.6)(x)
原因3:Dropout在训练过程中引入了噪声,这增加了模型的复杂性并可能导致过拟合的减少,但同时也可能使得模型在训练数据上的表现变差。