当validation_loss下降然后随着越来越大的波动上升时,这是否是过度拟合的迹象?

人工智能 卷积神经网络 张量流 喀拉斯 过拟合 卷积
2021-11-16 07:09:46

我正在尝试使用 ConvNet 对使用深度相机拍摄的图像进行分类。到目前为止,我有 4 组,每组 15 张图像。所以4个标签。原始图像为 680x880 16 位灰度。它们在将其馈送到 ImageDataGenerator 之前按比例缩小为 68x88 RGB(每个颜色通道具有相同的值)。我正在使用 ImageDataGenerator (IDG) 在集合上创建更多差异。(IDG 似乎不能处理 16 位灰度图像,也不能很好地处理 8 位图像,因此我将它们转换为 RGB)。

与常规 RGB 图像相比,我估计图像的特征较少,因为它代表深度。为了感受这些图像,这里有一些按比例缩小的示例:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我让它训练 4.096 个 epoch,看看会怎样。

这是模型和验证损失的结果。 在此处输入图像描述

您可以看到,在早期阶段,验证(测试/橙色线)损失下降,然后上升并开始出现大幅波动。这是过度拟合的迹象吗?

这是早期时代的放大图像。 在此处输入图像描述

模型损失(火车/蓝线)达到相对较低的值,精度为 1.000。训练再次显示相同类型的图表。这是最后的时代。

Epoch 4087/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.1137 - accuracy: 0.9286 - val_loss: 216.2349 - val_accuracy: 0.7812
Epoch 4088/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0364 - accuracy: 0.9643 - val_loss: 234.9622 - val_accuracy: 0.7812
Epoch 4089/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0041 - accuracy: 1.0000 - val_loss: 232.9797 - val_accuracy: 0.7812
Epoch 4090/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0091 - accuracy: 1.0000 - val_loss: 238.7082 - val_accuracy: 0.7812
Epoch 4091/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0248 - accuracy: 1.0000 - val_loss: 232.4937 - val_accuracy: 0.7812
Epoch 4092/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0335 - accuracy: 0.9643 - val_loss: 273.6542 - val_accuracy: 0.7812
Epoch 4093/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0196 - accuracy: 1.0000 - val_loss: 258.2848 - val_accuracy: 0.7812
Epoch 4094/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0382 - accuracy: 0.9643 - val_loss: 226.6226 - val_accuracy: 0.7812
Epoch 4095/4096
7/7 [==============================] - 0s 10ms/step - loss: 0.0018 - accuracy: 1.0000 - val_loss: 226.2943 - val_accuracy: 0.7812
Epoch 4096/4096
7/7 [==============================] - 0s 11ms/step - loss: 0.0201 - accuracy: 1.0000 - val_loss: 207.3653 - val_accuracy: 0.7812

不确定是否需要知道神经网络的架构来判断这是否在这个数据集上过拟合。无论如何,这是设置。

kernelSize = 3
kernel = (kernelSize, kernelSize)

model = Sequential()
model.add(Conv2D(16, kernel_size=kernel, padding='same', input_shape=inputShape, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, kernel_size=kernel, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, kernel_size=kernel, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(nr_of_classes, activation='softmax'))

sgd = tf.keras.optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=0.4, nesterov=True)
model.compile(loss='categorical_crossentropy', 
            optimizer=sgd,
            metrics=['accuracy'])
1个回答

是的,这看起来很像过拟合。与验证损失的大幅增加相比,线索在于训练损失较低且缓慢减少。

一个简单的解决方法是在 epoch 50 左右停止训练,采用最佳交叉验证结果来选择此时最通用的网络。然而,任何有助于提高稳定泛化的东西都可以在这里有所帮助——更多的训练数据、更多的正则化、更简单的模型。

棘手的部分是找到泛化的最佳组合。通常,如果你过度使用正则化来使 NN 完全稳定,它会失去一些准确性,因此你需要运行多个实验并仔细测量。由于您在这里有一个小数据集并且似乎能够运行 1000 个时期,因此我建议使用 k 折交叉验证来改进交叉验证损失的测量。