我试图使用这个笔记本,我们定义了一个基于DenseNet201的3头模型。基于AlexNet的工作正确,但DenseNet201给我一个错误。我是Pytorch用户,无法找出ValueError: Missing data for input "input_5". You passed a data dictionary with keys ['img_input']. Expected the following keys: ['input_5']
的错误。我知道在下面的代码片段中,我应该有一个名称'img_input'
,但我无法弄清楚。
class base_model():
def __init__(self, side_dim, n_bb, n_classes, name_model):
self.side_dim = side_dim
self.name_model = name_model
# base model DenseNet
if name_model == 'DenseNet201':
self.base_model = keras.applications.DenseNet201(
include_top=False,
input_shape=(self.side_dim, self.side_dim, 3),
)
self.image_input = self.base_model.input
self.flatten = keras.layers.Flatten()(self.base_model.layers[-2].output)
self.BatcNorm = keras.layers.BatchNormalization()(self.flatten)
print('Base model: DenseNet121 (7.2M params x 201 layers')
# ----------------------------------------------------------------------
# Add head with three different outputs to last layer of the basic model
# ----------------------------------------------------------------------
# class output
self.class_categorical = keras.layers.Dense((n_bb * n_classes),
activation='softmax')(self.BatcNorm)
self.class_output = keras.layers.Reshape((n_bb, n_classes),
name='class_output')(self.class_categorical)
# confidence output
self.score_confidence = keras.layers.Dense((n_bb),
name='score_confidence',
activation='tanh')(self.BatcNorm)
# bounding boxes coordinate output
self.score_coords = keras.layers.Dense((n_bb * 4),
name='score_coords')(self.BatcNorm)
当我运行以下命令时抛出错误:
# let's start our training
train_history = myModel.fit({'img_input': X_train},
{'class_output': class_target,
'score_confidence': target_confidence,
'score_coords': target_coords},
epochs=N_ep,
validation_data=({'img_input': X_val},
{'class_output': Val_class,
'score_confidence': Val_confidence,
'score_coords': Val_coords}),
batch_size=Batchs,
initial_epoch = init_ep,
verbose=1,
callbacks=[callbacks,
tensorboard_callback])
在基于AlexNet
的网络中,直接更改输入名称,但我不知道如何为DenseNet201做。
你能帮帮我吗?
问题是您的输入节点与保存您的输入的字典键没有相同的名称。
你可以事先用正确的名字创建你的输入层,并把它作为输入张量传递给DenseNet201函数。
self.image_input = keras.Input((self.side_dim, self.side_dim, 3), name="img_input")
self.base_model = keras.applications.DenseNet201(
include_top=False,
input_tensor=self.image_input,
)
另一个选项是通过使用输入节点的名称在字典中获得输入的名称:
myModel.fit({myModel.input.name: X_train},
{'class_output': class_target,
'score_confidence': target_confidence,
'score_coords': target_coords})
如果只有一个输入,最后一个选项是完全跳过使用字典:
myModel.fit(X_train,
{'class_output': class_target,
'score_confidence': target_confidence,
'score_coords': target_coords})