【发布时间】:2021-08-16 16:55:44
【问题描述】:
我使用 Keras 和 VGG16 迁移学习训练了一个 7 类图像分类器来预测手袋品牌。我每个类有 1000 个样本图像,并动态使用图像增强来增强数据集。令人惊讶的是,它返回的训练和验证准确性很差。此外,我在高原回调上设置了提前停止并减少了 LR,这些回调在 50 个 epoch 中的 40 个开始,让我获得了 14% 的训练和 10% 的验证准确率。这很奇怪,因为哑分类器的准确率会超过 14%。 这次我用 ResNet50 尝试了相同的集合,在 50 个 epoch 6 的训练和验证准确率分别为 17% 和 19%(提前停止回调开始)
我把我的代码放在这里给你们看看有没有我可能遗漏的地方。
image_shape = (224, 224)
batch_size = 128
train_datagen = ImageDataGenerator(rescale=1./255,
brightness_range = (0.5,1.5),
rotation_range=10,
width_shift_range=0.1,
height_shift_range=0.1,
shear_range=0.15,
zoom_range=0.1,
channel_shift_range = 10,
horizontal_flip=True,
validation_split= 0.2
)
test_datagen = ImageDataGenerator(rescale=1./255,
validation_split= 0.2)
train_generator = train_datagen.flow_from_directory(dst_dir,
target_size=image_shape,
batch_size=batch_size,
seed = 835,
subset= "training",
class_mode = "sparse"
)
val_generator = test_datagen.flow_from_directory(dst_dir,
target_size=image_shape,
batch_size=batch_size,
seed = 835,
subset="validation",
class_mode = "sparse"
)
# Define some callbacks
early_stopping = tf.keras.callbacks.EarlyStopping( monitor="val_loss",
min_delta=0,
patience=5,
verbose=0,
mode="auto",
baseline=None,
restore_best_weights=False,
)
reduceLR = tf.keras.callbacks.ReduceLROnPlateau(monitor="val_loss",
factor=0.1,
patience=5,
verbose=0,
mode="auto",
min_delta=0.0001,
cooldown=0,
min_lr=0,
)
#Transfer learning with VGG16
vgg16_model = tf.keras.applications.VGG16(pooling='avg',
weights='imagenet',
include_top=False,
input_shape=image_shape +(3,)
)
for layers in vgg16_model.layers:
layers.trainable=False
last_output = vgg16_model.layers[-1].output
vgg_x = Flatten()(last_output)
vgg_x = Dense(128, activation = 'relu')(vgg_x)
vgg_x = Dense(7, activation = 'softmax')(vgg_x)
vgg16_final_model = tf.keras.Model(vgg16_model.input, vgg_x)
vgg16_final_model.compile(loss = tf.keras.losses.SparseCategoricalCrossentropy(),
optimizer= 'adam',
metrics=['acc'])
vgg16_final_model.summary()
number_of_epochs = 50
vgg16_history = vgg16_final_model.fit(train_generator,
epochs = number_of_epochs,
validation_data = val_generator,
callbacks=[early_stopping, reduceLR],
verbose=1)
这是学习曲线:
【问题讨论】:
-
看一下分类混淆矩阵;这可能对正在发生的事情提供一些见解。
标签: python keras deep-learning conv-neural-network image-classification