【问题标题】:How can I prevent my model from being overfitted?如何防止我的模型过度拟合?
【发布时间】:2021-04-13 17:21:23
【问题描述】:

我是深度学习的新手,我尝试创建一个模型,但我不太了解model. add(layers)。我确定输入形状(用于识别)。我认为问题出在 Dropout 上,但我不明白它的价值。

谁能给我解释一下

model = models.Sequential()

model.add(layers.Conv2D(32, (3,3), activation = 'relu', input_shape = (128,128,3))) 
model.add(layers.MaxPooling2D((2,2))) 
model.add(layers.Conv2D(64, (3,3), activation = 'relu')) 
model.add(layers.MaxPooling2D((2,2))) 

model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu')) 
model.add(layers.Dense(6, activation='softmax'))
model.compile(loss='categorical_crossentropy', 
              optimizer=optimizers.Adam(lr=1e-4), metrics=['acc'])
-------------------------------------------------------
history = model.fit(
      train_data, 
      train_labels,
      epochs=30,
      validation_data=(test_data, test_labels),
      )

结果如下:

Epoch 15/30
5/5 [==============================] - 0s 34ms/step - loss: 0.3987 - acc: 0.8536 - val_loss: 0.7021 - val_acc: 0.7143
Epoch 16/30
5/5 [==============================] - 0s 31ms/step - loss: 0.3223 - acc: 0.8891 - val_loss: 0.6393 - val_acc: 0.7778
Epoch 17/30
5/5 [==============================] - 0s 32ms/step - loss: 0.3321 - acc: 0.9082 - val_loss: 0.6229 - val_acc: 0.7460
Epoch 18/30
5/5 [==============================] - 0s 31ms/step - loss: 0.2615 - acc: 0.9409 - val_loss: 0.6591 - val_acc: 0.8095
Epoch 19/30
5/5 [==============================] - 0s 32ms/step - loss: 0.2161 - acc: 0.9857 - val_loss: 0.6368 - val_acc: 0.7143
Epoch 20/30
5/5 [==============================] - 0s 33ms/step - loss: 0.1773 - acc: 0.9857 - val_loss: 0.5644 - val_acc: 0.7778
Epoch 21/30
5/5 [==============================] - 0s 32ms/step - loss: 0.1650 - acc: 0.9782 - val_loss: 0.5459 - val_acc: 0.8413
Epoch 22/30
5/5 [==============================] - 0s 31ms/step - loss: 0.1534 - acc: 0.9789 - val_loss: 0.5738 - val_acc: 0.7460
Epoch 23/30
5/5 [==============================] - 0s 32ms/step - loss: 0.1205 - acc: 0.9921 - val_loss: 0.5351 - val_acc: 0.8095
Epoch 24/30
5/5 [==============================] - 0s 32ms/step - loss: 0.0967 - acc: 1.0000 - val_loss: 0.5256 - val_acc: 0.8413
Epoch 25/30
5/5 [==============================] - 0s 32ms/step - loss: 0.0736 - acc: 1.0000 - val_loss: 0.5493 - val_acc: 0.7937
Epoch 26/30
5/5 [==============================] - 0s 32ms/step - loss: 0.0826 - acc: 1.0000 - val_loss: 0.5342 - val_acc: 0.8254
Epoch 27/30
5/5 [==============================] - 0s 32ms/step - loss: 0.0687 - acc: 1.0000 - val_loss: 0.5452 - val_acc: 0.8254
Epoch 28/30
5/5 [==============================] - 0s 32ms/step - loss: 0.0571 - acc: 1.0000 - val_loss: 0.5176 - val_acc: 0.7937
Epoch 29/30
5/5 [==============================] - 0s 32ms/step - loss: 0.0549 - acc: 1.0000 - val_loss: 0.5142 - val_acc: 0.8095
Epoch 30/30
5/5 [==============================] - 0s 32ms/step - loss: 0.0479 - acc: 1.0000 - val_loss: 0.5243 - val_acc: 0.8095

我从未超过 70% 的平均值,但在这方面我有 80%,但我认为我过度拟合了。我显然搜索了不同的文档,但我迷路了

【问题讨论】:

  • 请显示来自model..fit的训练数据,即训练损失、准确度和验证损失以及准确度
  • 那么确切的问题是什么?
  • 我做到了,我的问题是如何在不过度拟合的情况下改进我的模型..
  • 训练数据过拟合。训练和验证数据的形状如何?
  • 我认为因为我的 acc 在上一个 Epoch 为 100%,我认为训练和验证数据的形状为 128,128,3

标签: python tensorflow keras deep-learning


【解决方案1】:

您是否尝试过参加培训:

  • 数据增强
  • 预训练模型

查看每个 epoch 的执行时间,看起来您的数据集非常小。此外,尚不清楚您的数据集中是否存在任何类别不平衡。您可能应该尝试对折叠结果进行分层 CV 训练和分析。它不会防止过拟合,但最终会让您更深入地了解您的模型,这通常有助于减少过拟合。不过防止过拟合是个笼统的话题,网上搜一下资源。你也可以试试这个

model.compile(loss='categorical_crossentropy', 
              optimizer='adam, metrics=['acc'])
-------------------------------------------------------

# src: https://keras.io/api/callbacks/reduce_lr_on_plateau/
# reduce learning rate by a factor of 0.2 if val_loss -
# won't improve within 5 epoch. 
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                              patience=5, min_lr=0.00001)

# src: https://keras.io/api/callbacks/early_stopping/
# stop training if val_loss don't improve within 15 epoch.
early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=15)


history = model.fit(
      train_data, 
      train_labels,
      epochs=30,
      validation_data=(test_data, test_labels),
      callbacks=[reduce_lr, early_stop]
      )

您可能还会发现使用ModelCheckpointLearningRateScheduler 很有用。这并不能保证没有过度拟合,但可以采用一些方法。

【讨论】:

猜你喜欢
  • 2020-08-15
  • 2018-12-23
  • 1970-01-01
  • 2021-02-22
  • 2020-03-23
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2021-04-30
相关资源
最近更新 更多