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

时间:2019-05-31 03:57:52

标签: python tensorflow keras valueerror resnet

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

导入了模型
@Override
void start(Stage primaryStage) {
    Platform.setImplicitExit(true)
    ...
    // create stage and scene
}

但是当我尝试适合它

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'])

我收到以下值错误:

  

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

(150,2)数组显然来自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) ,但我不知道为什么特定的输出应该具有4维-应该是标签矢量,而不是4维图像大小和颜色矢量。有人可以帮助我确定如何使模型识别此输入吗?

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

1 个答案:

答案 0 :(得分:0)

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