为啥我的模型在第二个 epoch 过拟合?

Posted

技术标签:

【中文标题】为啥我的模型在第二个 epoch 过拟合?【英文标题】:Why is my model overfitting on the second epoch?为什么我的模型在第二个 epoch 过拟合? 【发布时间】:2020-12-03 23:15:54 【问题描述】:

我是深度学习的初学者,我正在尝试训练一个深度学习模型,以使用 Mobilenet_v2 和 Inception 对不同的 ASL 手势进行分类。

这是我的代码创建一个 ImageDataGenerator 用于创建训练和验证集。

# Reformat Images and Create Batches

IMAGE_RES = 224
BATCH_SIZE = 32

datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    validation_split = 0.4
)

train_generator = datagen.flow_from_directory(
    base_dir,
    target_size = (IMAGE_RES,IMAGE_RES),
    batch_size = BATCH_SIZE,
    subset = 'training'
)

val_generator = datagen.flow_from_directory(
    base_dir,
    target_size= (IMAGE_RES, IMAGE_RES),
    batch_size = BATCH_SIZE,
    subset = 'validation'
)

以下是训练模型的代码:

# Do transfer learning with Tensorflow Hub
URL = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4"
feature_extractor = hub.KerasLayer(URL,
                                   input_shape=(IMAGE_RES, IMAGE_RES, 3))
# Freeze pre-trained model
feature_extractor.trainable = False

# Attach a classification head
model = tf.keras.Sequential([
  feature_extractor,
  layers.Dense(5, activation='softmax')
])

model.summary()

# Train the model
model.compile(
  optimizer='adam',
  loss='categorical_crossentropy',
  metrics=['accuracy'])

EPOCHS = 5

history = model.fit(train_generator,
                    steps_per_epoch=len(train_generator),
                    epochs=EPOCHS,
                    validation_data = val_generator,
                     validation_steps=len(val_generator)
                    )

纪元 1/5 94/94 [==============================] - 19 秒 199 毫秒/步 - 损失:0.7333 - 准确度:0.7730 - val_loss : 0.6276 - val_accuracy: 0.7705

纪元 2/5 94/94 [===============================] - 18 秒 190 毫秒/步 - 损失:0.1574 - 准确度:0.9893 - val_loss : 0.5118 - val_accuracy: 0.8145

纪元 3/5 94/94 [===============================] - 18 秒 191 毫秒/步 - 损失:0.0783 - 准确度:0.9980 - val_loss : 0.4850 - val_accuracy: 0.8235

4/5 纪元 94/94 [==============================] - 18 秒 196 毫秒/步 - 损失:0.0492 - 准确度:0.9997 - val_loss : 0.4541 - val_accuracy: 0.8395

5/5 纪元 94/94 [==============================] - 18s 193ms/step - loss: 0.0349 - accuracy: 0.9997 - val_loss : 0.4590 - val_accuracy: 0.8365

我尝试过使用数据增强,但模型仍然过拟合,所以我想知道我的代码是否做错了什么。

【问题讨论】:

您使用了哪些数据增强方法?您的训练/验证/测试集的大小是多少? 您好,我将 70% 的数据用于训练,另外 30% 用于验证。我尝试使用以下数据扩充:rotation_range=15, width_shift_range=.1, height_shift_range=.1, Horizo​​ntal_flip = True, zoom_range=0.2。 在进行了 10 个 epoch 的数据增强和训练后,我的训练精度为 0.9997,val_accuracy 为 0.8365。 【参考方案1】:

您的数据非常小。尝试使用随机种子进行拆分并检查问题是否仍然存在。

如果是,则使用正则化并降低神经网络的复杂性。

还可以尝试不同的优化器和更小的学习率(尝试 lr 调度器)

【讨论】:

【参考方案2】:

您的数据集似乎非常小,一些真正的输出仅由输入-输出曲线中一小段距离的输入隔开。这就是为什么它很容易符合这些点。

【讨论】:

以上是关于为啥我的模型在第二个 epoch 过拟合?的主要内容,如果未能解决你的问题,请参考以下文章

局部加权回归欠拟合过拟合 - Andrew Ng机器学习公开课笔记1.3

我如何从均方根误差中理解我的模型过拟合或欠拟合?

五神经网络过拟合处理方法

什么是过拟合,如何避免?

这是过拟合的例子吗?

随机森林为啥不会过度拟合