如何将顶层添加到预训练的功能模型

How to add top layers to a pre-trained functional model

我正在尝试使用 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: Error when checking target: expected activation_352 to have 4 dimensions, but got array with shape (150, 2)

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

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

查看 Möller's comments and the code from Yu-Yang 后,我能够使用以下代码 re-formulate 模型的顶部:

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().input 和一个 output,所以如果有人能向我解释为什么我跳过了那里的 Flatten() 我将不胜感激it--Model() 显然不需要所有层的列表,所以它只是一个输入和一个输出吗?我会看一下文档,但与此同时,如果有人路过并有明确的解释,我会接受的。