简体   繁体   English

如何防止我的 model 过拟合?

[英]How can I prevent my model from being overfitted?

I'm a newbie with deep learning and I try to create a model and I don't really understand the model. add(layers) .我是深度学习的新手,我尝试创建一个 model 但我并不真正理解model. add(layers) I m sure that the input shape (it's for recognition).我确定输入的形状(用于识别)。 I think the problem is in the Dropout, but I don't understand the value.我认为问题出在 Dropout 上,但我不明白其中的价值。

Can someone explains to me the有人可以向我解释

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),
      )

and here is the result:结果如下:

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

I never depassed the 70% average but on this i have 80% but i think i'm on overfitting.. I evidemently searched on differents docs but i'm lost我从来没有超过 70% 的平均水平,但在这方面我有 80%,但我认为我过度拟合了。我显然搜索了不同的文档,但我迷路了

Have you try following into your training:您是否尝试过以下训练:

  • Data Augmentation数据扩充
  • Pre-trained Model预训练 Model

Looking at the execution time per epoch, it looks like your data set is pretty small.查看每个时期的执行时间,您的数据集似乎很小。 Also, it's not clear whether there is any class imbalance in your dataset.此外,尚不清楚您的数据集中是否存在 class 不平衡。 You probably should try stratified CV training and analysis on the folds results.您可能应该尝试对折叠结果进行分层 CV 训练和分析。 It won't prevent overfit but it will eventually give you more insight into your model, which generally can help to reduce overfitting.它不会防止过度拟合,但它最终会让您更深入地了解您的 model,这通常有助于减少过度拟合。 However, preventing overfitting is a general topic, search online to get resources.不过防止过拟合是个笼统的话题,网上搜索一下资源。 You can also try this你也可以试试这个

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]
      )

You may also find it useful of using ModelCheckpoint or LearningRateScheduler .您可能还会发现使用ModelCheckpointLearningRateScheduler很有用。 This doesn't guarantee of no overfit but some approach for that to adopt.这并不能保证不会过度拟合,但可以采用某种方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM