我想使用keras.applications.resnet50
使用以下设置为两类问题训练Resnet:
from keras.layers import Dropout, Flatten, Dense
from keras.applications.resnet50 import ResNet50
from keras.models import Model
resNet = ResNet50(include_top=False, weights=None)
y = resNet.output
y = Flatten()(y)
y = Dense(2, activation='softmax')(y)
model = Model(inputs=resNet.input, outputs=y)
opt = keras.optimizers.Adam()
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
epochs = 15
model.fit(train_tensors, train_targets,
validation_data=(valid_tensors, valid_targets),
epochs=epochs, batch_size=10, callbacks=[checkpointer], verbose=1)
运行代码会引发错误
Exception: The shape of the input to "Flatten" is not fully defined
因此输出层的输入张量一定有问题,在我的例子中是一个单热编码的矢量,即大小为2的一维数组。我做错了什么?
答案 0 :(得分:1)
由于您没有对Resnet模型的输出应用池(平均值或最大值),因此它提供的输出是4-D张量,将传递到Dense层。在密集层之前应用池是个好主意,它将从前一层中提取每个特征的 avg 或 max ,然后传递到Dense层。另一种选择是如果你不想要应用池化层,那么你可以将 Flatten()层应用于Resnet输出,这也可以将4-D张量转换为2-D张量,您的Dense图层需要预期。
答案 1 :(得分:1)
你得到了
异常:" Flatten"的输入形状。尚未完全定义
因为您尚未在resnet网络中设置输入形状。尝试:
get value(): string { // return type
return this.service.value
}
此外,由于你在输出层中使用带有sigmoid激活的binary_crossentropy,你应该只使用1个神经元而不是2,如下所示:
resNet = ResNet50(include_top=False, weights=None, input_shape=(224, 224, 3))