如何将顶层添加到预训练的功能模型
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 图像大小和颜色向量。谁能帮我弄清楚如何让模型识别此输入?
注:我知道 Daniel 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()
显然不需要所有层的列表,所以它只是一个输入和一个输出吗?我会看一下文档,但与此同时,如果有人路过并有明确的解释,我会接受的。
我正在尝试使用 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 图像大小和颜色向量。谁能帮我弄清楚如何让模型识别此输入?
注:我知道 Daniel Möller 提到 here 我需要添加一个 Flatten()
层,但是功能模型的性质及其调用几乎不允许这样做,除非我想从头开始重写整个 ResNet(这似乎违背了拥有可重用的预训练模型的目的)。任何见解将不胜感激。
查看 Möller's comments and the code from Yu-Yang
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()
显然不需要所有层的列表,所以它只是一个输入和一个输出吗?我会看一下文档,但与此同时,如果有人路过并有明确的解释,我会接受的。