【问题标题】:Accuracy low on validation set using vgg16使用 vgg16 验证集的准确性低
【发布时间】:2020-10-01 11:07:33
【问题描述】:

我正在为一个项目进行犬种分类,但遇到了一个我不知道如何解决的大问题。

数据集是Stanford Dogs dataset提供的狗的图片。

我使用 keras 进行数据扩充:

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras import optimizers
from keras.callbacks import History 
from keras.applications import vgg16

batch_size = 16

# this is the augmentation configuration I will use for training
 train_datagen = ImageDataGenerator(rotation_range=20,
                               zoom_range=0.2,
                               horizontal_flip=True,
                               fill_mode='nearest',
                               preprocessing_function=vgg16.preprocess_input)

 # This is the augmentation configuration I will use for testing/validation... just a rescale
 test_datagen = ImageDataGenerator(rescale=1./255)

 # This is the generator which will read pictures found in my training subset
 train_generator = train_datagen.flow_from_directory('../data/train/',
                                                target_size = (224, 224),
                                                batch_size = batch_size,
                                                shuffle=True,
                                                class_mode = 'categorical',
                                                seed=42)

  # This is the generator for validation data
  validation_generator = test_datagen.flow_from_directory('../data/validation/',
                                                    target_size = (224, 224),
                                                    batch_size = batch_size,
                                                    class_mode = 'categorical')

然后我使用带有 VGG16 的迁移学习来训练我的模型:

from keras.applications.vgg16 import VGG16
from keras.layers import Input, Dense, Flatten, GlobalAveragePooling2D
from keras.models import Model, Sequential

pretrained_model = VGG16(weights="imagenet", include_top=False, input_shape=(224, 224, 3))

for layer in pretrained_model.layers:
    layer.trainable = False

x = pretrained_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation="relu")(x)
predictions = Dense(120, activation='softmax')(x)

model = Model(inputs = pretrained_model.input, outputs=predictions) 

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

当我训练模型时,它似乎过拟合了: 我在训练中获得了 0.99 的准确率,在验证中获得了 0.23 的准确率。

当查看训练集和验证集中的图像时,没有明显的原因导致验证的准确性如此差。

我所做的是手动检查模型在验证和测试中预测的几张图像(超过 50 张)的品种,超过 80% 是正确的预测。

所以我认为验证准确性存在问题,但不知道如何解决。

感谢您的帮助!

【问题讨论】:

  • 训练数据没有重新缩放,对吧?
  • 是的,它是通过 vgg16_prepocess_input
  • 尝试在验证集上也使用vgg16.preprocess_input
  • 所以我尝试了您的解决方案,它在第一步 (0,7) 中为我提供了更好的验证准确度,但在训练集上仍然得到改进时根本没有改进。

标签: python tensorflow machine-learning keras vgg-net


【解决方案1】:

很少有事情可以提高训练和验证数据集的分类准确性:

  1. 首先,设置 layer.trainable=True,因为 Imagenet 数据集是在不同的数据集上训练的。只是微调顶层将直接导致过度拟合。加载 imagenet 权重,但重新训练所有或几层。

  2. 使用具有噪声学生权重的 EfficientNet。要训​​练的参数数量较少。由于它具有可扩展的架构,它提供了更好的准确性。将整个数据集转换为 numpy 数组。我猜 np 数组会加载得更快。使用 sklearn train_test_split 函数拆分训练数据。标准化数据集 (1/255)。在火车数据上沿轴 0 计算 np.mean 并将其从火车和 val 数据集中减去。

  3. 您可以使用测试时间增加。在您的测试数据生成器中,进行简单的水平翻转、垂直翻转(如果数据看起来真实)和仿射变换。它将生成数据的多个视图,并帮助模型平均出更多可能的类别。

  4. 检查 imgaug 库(浮雕、锐化、噪声添加等)。此外,还有一些已被证明有用的 random_eraser、剪切和混合策略。将此添加到 预处理函数,而不是放入 preprocess_input。它还有助于规范您的模型。

  5. 尝试标签平滑。它还可以帮助您的分类器为正确的类提供更多概率。

  6. 尝试学习率预热。像这样:

LR_START = 0.0001
LR_MAX = 0.00005
LR_MIN = 0.0001
LR_RAMPUP_EPOCHS = 4
LR_SUSTAIN_EPOCHS = 6
LR_EXP_DECAY = .8


def lrfn(epoch):
    if epoch < LR_RAMPUP_EPOCHS:
        lr = (LR_MAX - LR_START) / LR_RAMPUP_EPOCHS * epoch + LR_START
    elif epoch < LR_RAMPUP_EPOCHS + LR_SUSTAIN_EPOCHS:
        lr = LR_MAX
    else:
        lr = (LR_MAX - LR_MIN) * LR_EXP_DECAY**(epoch - LR_RAMPUP_EPOCHS - LR_SUSTAIN_EPOCHS) + LR_MIN
    return lr

  1. 您还可以提取特征并应用集成特征分类(XGBoost、Adaboost、BaggingClassifier)或三元组损失。

  2. 尝试将图像分辨率提高到 299。分辨率越高,细粒度分类效果越好。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 2019-05-07
    • 2015-04-21
    • 1970-01-01
    • 2020-02-11
    • 2018-08-03
    • 2023-03-27
    • 2020-12-01
    • 2021-07-22
    相关资源
    最近更新 更多