【发布时间】: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_epoch和validation_steps;target_size应该始终是(height, width)元组。你颠倒了它的成员。
标签: tensorflow keras