我正在尝试使用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(这似乎违背了具有可重用的预训练模型的目的)。任何见识将不胜感激。
答案 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()
显然不需要所有层的列表,因此仅仅是输入和输出吗?我会看一下文档,但与此同时,如果有人徘徊并且有明确的解释,我会接受的。