首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Val_acc不会增加

Val_acc不会增加
EN

Stack Overflow用户
提问于 2020-08-29 20:33:37
回答 2查看 130关注 0票数 0

我试图用迁移学习mobilenetv2训练一个模型,但我的val精度在0,60左右停止增长。我试着训练我已经构建的顶层,在那之后我还试着训练一些mobilenets层。同样的结果。我怎么才能修复它?我不得不提一下,我是深度学习的新手,我不确定我构建的顶层是正确的。请随时纠正我。

代码语言:javascript
复制
IMAGE_SIZE = 224
BATCH_SIZE = 64

train_data_dir = "/content/FER2013/Training"
validation_data_dir = "/content/FER2013/PublicTest"


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

train_generator = datagen.flow_from_directory(
    train_data_dir,
    target_size=(IMAGE_SIZE, IMAGE_SIZE),
    class_mode = 'categorical',
    batch_size=BATCH_SIZE)

val_generator = datagen.flow_from_directory(
    validation_data_dir,
    target_size=(IMAGE_SIZE, IMAGE_SIZE),
    class_mode = 'categorical',
    batch_size=BATCH_SIZE)
代码语言:javascript
复制
IMG_SHAPE = (IMAGE_SIZE, IMAGE_SIZE, 3)

base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')
代码语言:javascript
复制
model = tf.keras.Sequential([
   base_model,
  
  tf.keras.layers.GlobalAveragePooling2D(),
  tf.keras.layers.Dense(512, activation='relu'),
  tf.keras.layers.Dense(256, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(64, activation='relu'),
  tf.keras.layers.BatchNormalization(),
  tf.keras.layers.Dense(32, activation='relu'),
  tf.keras.layers.Dense(16, activation='relu'),
  tf.keras.layers.Dense(7, activation='softmax')
])
代码语言:javascript
复制
model.compile(loss='categorical_crossentropy',
              optimizer = tf.keras.optimizers.Adam(1e-5), #I've tried with .Adam as well
              metrics=['accuracy'])
代码语言:javascript
复制
from keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint
lr_reducer = ReduceLROnPlateau(monitor='val_loss', factor=0.9, patience=3)
代码语言:javascript
复制
early_stopper = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=6, mode='auto')
代码语言:javascript
复制
checkpointer = ModelCheckpoint('/content/weights.hd5', monitor='val_loss', verbose=1, save_best_only=True)
代码语言:javascript
复制
epochs = 50
learning_rate = 0.004 #I've tried other values as well
代码语言:javascript
复制
history_fine = model.fit(train_generator, 
                         steps_per_epoch=len(train_generator), 
                         epochs=epochs, 
                         callbacks=[lr_reducer, checkpointer, early_stopper],
                         validation_data=val_generator, 
                         validation_steps=len(val_generator))
代码语言:javascript
复制
Epoch 1/50
448/448 [==============================] - ETA: 0s - loss: 1.7362 - accuracy: 0.2929
Epoch 00001: val_loss improved from inf to 1.58818, saving model to /content/weights.hd5
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
INFO:tensorflow:Assets written to: /content/weights.hd5/assets
448/448 [==============================] - 166s 370ms/step - loss: 1.7362 - accuracy: 0.2929 - val_loss: 1.5882 - val_accuracy: 0.4249
Epoch 2/50
448/448 [==============================] - ETA: 0s - loss: 1.3852 - accuracy: 0.4664
Epoch 00002: val_loss improved from 1.58818 to 1.31690, saving model to /content/weights.hd5
INFO:tensorflow:Assets written to: /content/weights.hd5/assets
448/448 [==============================] - 165s 368ms/step - loss: 1.3852 - accuracy: 0.4664 - val_loss: 1.3169 - val_accuracy: 0.4827
Epoch 3/50
448/448 [==============================] - ETA: 0s - loss: 1.2058 - accuracy: 0.5277
Epoch 00003: val_loss improved from 1.31690 to 1.21979, saving model to /content/weights.hd5
INFO:tensorflow:Assets written to: /content/weights.hd5/assets
448/448 [==============================] - 165s 368ms/step - loss: 1.2058 - accuracy: 0.5277 - val_loss: 1.2198 - val_accuracy: 0.5271
Epoch 4/50
448/448 [==============================] - ETA: 0s - loss: 1.0828 - accuracy: 0.5861
Epoch 00004: val_loss improved from 1.21979 to 1.18972, saving model to /content/weights.hd5
INFO:tensorflow:Assets written to: /content/weights.hd5/assets
448/448 [==============================] - 166s 370ms/step - loss: 1.0828 - accuracy: 0.5861 - val_loss: 1.1897 - val_accuracy: 0.5533
Epoch 5/50
448/448 [==============================] - ETA: 0s - loss: 0.9754 - accuracy: 0.6380
Epoch 00005: val_loss improved from 1.18972 to 1.13336, saving model to /content/weights.hd5
INFO:tensorflow:Assets written to: /content/weights.hd5/assets
448/448 [==============================] - 165s 368ms/step - loss: 0.9754 - accuracy: 0.6380 - val_loss: 1.1334 - val_accuracy: 0.5743
Epoch 6/50
448/448 [==============================] - ETA: 0s - loss: 0.8761 - accuracy: 0.6848
Epoch 00006: val_loss did not improve from 1.13336
448/448 [==============================] - 153s 342ms/step - loss: 0.8761 - accuracy: 0.6848 - val_loss: 1.1348 - val_accuracy: 0.5882
Epoch 7/50
448/448 [==============================] - ETA: 0s - loss: 0.7783 - accuracy: 0.7264
Epoch 00007: val_loss did not improve from 1.13336
448/448 [==============================] - 153s 341ms/step - loss: 0.7783 - accuracy: 0.7264 - val_loss: 1.1392 - val_accuracy: 0.5893
Epoch 8/50
448/448 [==============================] - ETA: 0s - loss: 0.6832 - accuracy: 0.7638
Epoch 00008: val_loss did not improve from 1.13336
448/448 [==============================] - 153s 342ms/step - loss: 0.6832 - accuracy: 0.7638 - val_loss: 1.1542 - val_accuracy: 0.6052
EN

回答 2

Stack Overflow用户

发布于 2020-08-29 20:58:04

由于你的验证损失在增加,而训练损失在减少,我认为你可能存在训练集过拟合的问题。以下是一些可能有帮助的东西:

  • 使用密度较低的层。我认为regularization.

的数量太多了,但我可能错了,因为我不知道你在解决什么问题。

  • 在每个密集层之后添加数据增强层。

  • 在你的训练集上使用数据增强(因为你已经在使用ImageDataGenerator了,这不会很难)。

  • 减少了密集层中神经元的数量。

  • 使用dropout

您可以尝试同时应用其中的任何一个或多个。调整您的模型是大量的试验和错误,做一些实验,并保持模型达到最佳性能。

票数 1
EN

Stack Overflow用户

发布于 2020-08-29 21:47:28

随着训练损失的减少和验证损失的增加,你似乎处于过适应的状态。你的模型越复杂,发生这种情况的可能性就越高,所以我建议你尽量简化你的模型。试着移除所有的密层,除了最上面的一层,它产生了你的分类。运行它,看看它是如何工作的。我使用MobileNet的经验是它应该工作得很好。如果不是,则添加一个具有大约128个神经元的额外致密层,然后是一个退出层。使用丢失值来调整过拟合。如果你仍然过度拟合,你可能想要考虑添加正则化到这个密集的层。文档是here.的也可能是你需要更多的训练样本。使用图像数据生成器来扩充您的数据集。例如,设置horizontal_flip-True。我注意到您没有在图像数据生成器中包含MobileNetV2预处理功能。我认为这是必要的,所以修改代码如下所示。我还发现,如果我训练整个模型,我使用MobileNet会得到最好的结果。因此,在编译模型之前,请添加以下代码。

代码语言:javascript
复制
ImageDataGenerator(preprocessing_function=tf.keras.applications.mobilenet_v2.preprocess_input)
for layer in model.layers:
    layer.trainable=True

顺便说一句,你可以删除模型中的那一层,然后在MobileNet中设置参数pooling='max‘。我发现你一开始的学习率很低,试试.005之类的吧。由于您有ReduceLROnPlateau回调,如果它太大,这将调整它,但会让您更快地收敛。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63647016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档