基于DenseNet201使用Keras的多头模型



我试图使用这个笔记本,我们定义了一个基于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})

相关内容

  • 没有找到相关文章

最新更新