【发布时间】: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