【问题标题】:Why is the model not learning with pretrained vgg16 in keras?为什么模型没有在 keras 中使用预训练的 vgg16 进行学习?
【发布时间】:2019-04-23 19:34:06
【问题描述】:

我正在使用 Keras 提供的预训练 VGG 16 模型并将其应用于 SVHN dataset 这是一个包含 10 类数字 0 - 10 的数据集。网络没有学习并且一直停留在 @987654323 @ 准确性。有些事情我做错了,但我无法识别它。我的训练方式如下:

import tensorflow.keras as keras

## DEFINE THE MODEL ##
vgg16 = keras.applications.vgg16.VGG16()

model = keras.Sequential()
for layer in vgg16.layers:
   model.add(layer)

model.layers.pop()

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

model.add(keras.layers.Dense(10, activation = "softmax"))


## START THE TRAINING ##
train_optimizer_rmsProp = keras.optimizers.RMSprop(lr=0.0001)
model.compile(loss="categorical_crossentropy", optimizer=train_optimizer_rmsProp, metrics=['accuracy'])
batch_size = 128*1

data_generator = keras.preprocessing.image.ImageDataGenerator(
    rescale = 1./255
)


train_generator = data_generator.flow_from_directory(
        'training',
        target_size=(224, 224),
        batch_size=batch_size,
        color_mode='rgb',
        class_mode='categorical'
)

validation_generator = data_generator.flow_from_directory(
        'validate',
        target_size=(224, 224),
        batch_size=batch_size,
        color_mode='rgb',
        class_mode='categorical')

history = model.fit_generator(
    train_generator, 
    validation_data = validation_generator, 
    validation_steps = math.ceil(val_split_length / batch_size),
    epochs = 15, 
    steps_per_epoch = math.ceil(num_train_samples / batch_size), 
    use_multiprocessing = True, 
    workers = 8, 
    callbacks = model_callbacks, 
    verbose = 2
)

我做错了什么?有什么我想念的吗?我期待一个非常高的准确度,因为它承载来自imagenet 的权重,但它从第一个纪元开始就停留在0.17 准确度。

【问题讨论】:

    标签: python tensorflow keras computer-vision conv-neural-network


    【解决方案1】:

    我假设您正在对 32x32 类似 MNIST 的图像进行上采样以适合 VGG16 输入,在这种情况下您实际上应该做的是删除所有密集层,这样您就可以输入任何图像大小,就像在卷积层中一样权重与图像大小无关。

    你可以这样做:

    vgg16 = keras.applications.vgg16.VGG16(include_top=False, input_shape=(32, 32))
    

    我认为应该是构造函数的默认行为。

    当你对图像进行上采样时,最好的情况是你基本上模糊了它,在这种情况下,你必须考虑原始图像的单个像素对应于上采样图像的 7 个像素,而 VGG16 的过滤器是 3 个像素宽,换句话说,您正在失去图像的特征。

    不必像原来的 VGG16 那样在末尾添加 3 个密集层,您可以尝试使用代码中的相同层。

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2018-07-13
      • 1970-01-01
      • 2018-12-11
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多