【问题标题】:Very Low Accuracy upon Retraining VGG16 in Keras在 Keras 中重新训练 VGG16 的准确性非常低
【发布时间】:2018-08-03 02:06:43
【问题描述】:

我正在尝试使用迁移学习为新数据集重新训练 VGG16。我已经用 ImageNet 权重加载了模型,没有顶部的完全连接层,从瓶颈层获得了数据集的预测,并用这些瓶颈预测训练了一个小模型。但是,在 50 个 epoch 后验证准确度非常低,为 0.002。我无法弄清楚问题出在我的代码中,这是来自 Keras 文档的 InceptionV3 再训练代码的修改版本。我已经能够以 0.88 的准确度在同一数据集上重新训练 ResNet50。我的代码如下。

from keras.applications import VGG16
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, Flatten, Dropout
from keras import backend as K
from keras.preprocessing.image import ImageDataGenerator
from keras.layers import Input

img_width, img_height = 224, 224

train_data_dir = 'Dataset/train'
validation_data_dir = 'Dataset/test'

nb_train_samples = 31119
nb_validation_samples = 13362
nb_epoch = 50
nb_classes = 281
batch_size = 16

input_tensor = Input(shape=(224, 224, 3))
base_model = VGG16(weights="imagenet", input_tensor=input_tensor, include_top=False)

x = base_model.output
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(nb_classes, activation='sigmoid')(x)

model = Model(input=base_model.input, output=predictions)

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

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

train_datagen = ImageDataGenerator(
        rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=16,
    class_mode='categorical'
)

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=16,
    class_mode='categorical'
)

history = model.fit_generator(
    train_generator,
    nb_epoch=nb_epoch,
    steps_per_epoch=nb_train_samples/batch_size,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples/batch_size)

【问题讨论】:

  • 在使用categorical_crossentropy时,我们通常会在最后激活softmax。使用sigmoid 的任何具体原因?此外,只需几个 cmets:如果要使用所有样本,则无需设置 steps_per_epochvalidation_stepstarget_size 应该始终是 (height, width) 元组。你颠倒了它的成员。

标签: tensorflow keras


【解决方案1】:

VGG16 使用 Keras 的 Sequential 模型,ResNet 函数式 API。 因此,您应该更换

x = base_model.output
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(nb_classes, activation='sigmoid')(x)

model = Model(input=base_model.input, output=predictions)

通过

model = Models.Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, activation="softmax"))

在使用分类 class_mode 时也使用 softmax 而不是 sigmoid。

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2017-10-09
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多