【问题标题】:How to add top layers to a pre-trained functional model如何将顶层添加到预训练的功能模型
【发布时间】:2019-10-16 17:07:26
【问题描述】:

我正在尝试使用 Keras 创建 ResNet50 模型来预测猫与狗。我决定只使用 1000 点的数据子集,并使用 700-150-150 的训练-验证-测试拆分。 (我知道它很小,但这是我的计算机可以处理的。)我已经导入了模型使用

resnet_model = keras.applications.ResNet50(include_top=False, input_tensor=None, input_shape=None, pooling=None, classes=2)
resnet_model.compile(Adam(lr=.0001), loss='categorical_crossentropy', metrics=['accuracy'])

但是当我尝试适应它时

aug = ImageDataGenerator(rotation_range=20, zoom_range=0.15,
  width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15,
  horizontal_flip=True, fill_mode="nearest")

resnet_model.fit_generator(aug.flow(X_train, y_train, batch_size = batches), steps_per_epoch = len(X_train) // batches,
                          validation_data = (X_valid, y_valid), validation_steps = 4, epochs = 10, verbose = 1)

我得到以下值错误:

ValueError: 检查目标时出错:预期 activation_352 有 4 维,但得到的数组形状为 (150, 2)

(150,2) 数组显然来自valid_y,但我不知道为什么那个特定的输出应该有 4 维——这应该是标签向量,而不是 4 维图像大小和颜色矢量。有人可以帮我弄清楚如何让模型识别这个输入吗?

注意:我知道 Dan​​iel Möller 提到 here 我需要添加一个 Flatten() 层,但函数模型的性质及其调用似乎不允许这样做,除非我想从头开始重写整个 ResNet(这似乎违背了拥有可重用预训练模型的目的)。任何见解将不胜感激。

【问题讨论】:

    标签: python tensorflow keras valueerror resnet


    【解决方案1】:

    在查看 Möller's comments 和 Yu-Yang here 的代码后,我能够使用以下代码重新制定模型的顶部:

    pre_resnet_model = keras.applications.ResNet50(include_top=False, weights='imagenet', input_tensor=None, input_shape=(224,224,3), pooling=None, classes=2)
    for layer in pre_resnet_model.layers:
        layer.trainable = False
    flatten = Flatten()(pre_resnet_model.output)   
    output = Dense(2, activation='softmax')(flatten)
    resnet_model = Model(pre_resnet_model.input, output)
    

    flatten 图层变平,然后output 图层在此基础上进行绘制。我还不确定为什么Model() 只需要ResNet50().inputoutput,所以如果有人可以向我解释为什么我跳过了Flatten(),我会很感激——Model() 显然不需要不需要所有层的列表,那么它只是一个输入和一个输出吗?我会看一下文档,但与此同时,如果有人路过并有明确的解释,我会接受。

    【讨论】:

    • 小崽子。 a = Input(shape=(32,)) b = Dense(32)(a) model = Model(inputs=a, outputs=b) “这个模型将包括在给定a 的情况下计算b 所需的所有层。”没有比这更清楚的了。我会留下这个问题,因为我认为它整合了我花了很长时间搜索的大量信息,但其中一些在文档中也很清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2021-11-05
    • 2021-04-05
    相关资源
    最近更新 更多