【问题标题】:Keras VGG16 low validation accuracyKeras VGG16 验证准确率低
【发布时间】:2020-02-12 22:55:56
【问题描述】:

我使用预训练的 VGG16 构建了一个非常简单的卷积神经网络。 我正在使用 Pokemon generation one 数据集,其中包含属于 149 个不同类别的 10.000 张图像。我手动拆分数据集,0.7 用于训练,0.3 用于验证在不同目录中。

问题是我的准确度很高,但验证准确度不是很高。

在下面的代码中,找到了最佳配置,使用学习率 0.0001 的 Adam 优化器。

有人可以建议我如何提高性能并避免过度拟合吗?

代码:

import tensorflow as tf
import numpy as np

vgg_model = tf.keras.applications.VGG16(weights='imagenet', include_top=False, input_shape = (224,224,3))
vgg_model.trainable = False

model = tf.keras.models.Sequential()
model.add(vgg_model)
model.add(tf.keras.layers.Flatten(input_shape=vgg_model.output_shape[1:]))
model.add(tf.keras.layers.Dense(256, activation='relu'))
model.add(tf.keras.layers.Dense(149, activation='softmax'))

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0001, decay=0.0001/100), loss='categorical_crossentropy', metrics=['accuracy'])

train= tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
test= tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
training_set = train.flow_from_directory('datasets/generation/train', target_size=(224,224), class_mode = 'categorical')
val_set = train.flow_from_directory('datasets/generation/test', target_size=(224,224), class_mode = 'categorical')

history = model.fit_generator(training_set, steps_per_epoch = 64, epochs = 100, validation_data = val_set, validation_steps = 64)

这是每 10 个 epoch 的输出:

Epoch 1/100
64/64 [====================] - 57s 891ms/step - loss: 4.8707 - acc: 0.0654 - val_loss: 4.7281 - val_acc: 0.0718
Epoch 10/100
64/64 [====================] - 53s 821ms/step - loss: 2.9540 - acc: 0.4141 - val_loss: 3.2206 - val_acc: 0.3447
Epoch 20/100
64/64 [====================] - 56s 869ms/step - loss: 1.9040 - acc: 0.6279 - val_loss: 2.6155 - val_acc: 0.4577
Epoch 30/100
64/64 [====================] - 50s 781ms/step - loss: 1.2899 - acc: 0.7658 - val_loss: 2.3345 - val_acc: 0.4897
Epoch 40/100
64/64 [====================] - 53s 832ms/step - loss: 1.0192 - acc: 0.8096 - val_loss: 2.1765 - val_acc: 0.5149
Epoch 50/100
64/64 [====================] - 55s 854ms/step - loss: 0.7948 - acc: 0.8672 - val_loss: 2.1082 - val_acc: 0.5359
Epoch 60/100
64/64 [====================] - 52s 816ms/step - loss: 0.5774 - acc: 0.9106 - val_loss: 2.0673 - val_acc: 0.5435
Epoch 70/100
64/64 [====================] - 52s 811ms/step - loss: 0.4383 - acc: 0.9385 - val_loss: 2.0499 - val_acc: 0.5454
Epoch 80/100
64/64 [====================] - 56s 881ms/step - loss: 0.3638 - acc: 0.9473 - val_loss: 1.9849 - val_acc: 0.5501
Epoch 90/100
64/64 [====================] - 55s 860ms/step - loss: 0.2860 - acc: 0.9609 - val_loss: 1.9564 - val_acc: 0.5531
Epoch 100/100
64/64 [====================] - 52s 815ms/step - loss: 0.2328 - acc: 0.9697 - val_loss: 2.0334 - val_acc: 0.5615

【问题讨论】:

    标签: tensorflow keras deep-learning conv-neural-network vgg-net


    【解决方案1】:

    正如我在您上面的输出中看到的那样,您还没有过度拟合,但训练和验证分数之间存在巨大差异。您可以尝试很多方法来提高验证分数。

    • 您可以添加更多训练数据(并非总是可以)
    • 更重的增强
    • 并添加 dropout 层

    像这样添加一个 dropout 层:

    model.add(tf.keras.layers.Dense(256, activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(149, activation='softmax'))
    

    【讨论】:

    • 谢谢,我试过了,但还是不行,现在我只得到了 75% 的准确率和 60% 的验证准确率(提高了 4%)
    • 这始终是机器学习的目标,提高 val 分数。 train 和 val 分数之间有差距是正常的,我们想要的是提高 val 分数。在 149 个类中 60% 的准确率听起来不错。
    猜你喜欢
    • 2019-05-07
    • 2020-02-11
    • 2018-09-18
    • 2020-10-01
    • 2023-03-17
    • 2019-02-14
    • 2021-10-13
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多