我的问题如下: 我有一个Keras模型,其中损失函数实现为Lambda层。在此损失函数中,我希望使用模型中间层的输出。我正在做的事情看起来像这样:
.....model_init definition.....
layer_output = model_init.get_layer('conv2d_5').output
model_loss = Lambda(loss_function, output_shape=(1,), name='loss_function',
arguments={'layer': layer_output})(
[*model_init.output, *y_true])
model = Model([model_init.input, *y_true], model_loss)
def loss_function(args, layer):
#do stuff with layer
return loss
在这里,model_init.output和y_true都是3层的列表。当使用多个GPU时,我注意到一个问题,即整个图层而不是特定GPU的特定样本通过了该层。所以我这样修改了代码:
.....model_init definition.....
layer_output = model_init.get_layer('conv2d_5').output
model_loss = Lambda(loss_function, output_shape=(1,), name='loss_function',
arguments={'layer': layer_output})(
[*model_init.output, *y_true, *[layer_output, layer_output, layer_output]])
model = Model([model_init.input, *y_true], model_loss)
def loss_function(args, layer):
intermediate_layer = args[6]
intermediate_layer = tf.Print(intermediate_layer, [intermediate_layer, layer], message="comparing layer values")
#do stuff with intermediate_layer
return loss
这有助于解决与多GPU处理有关的问题。但是,现在,如果我查看传递给损失函数的中间层的值,我注意到当将其作为函数的参数传递时(如第一个代码示例中)以及当我将它们传递给函数时,它们是不同的直接将其连接到Lambda层(如第二个示例中所示)。 所以我想知道这是怎么回事,哪种方法才是正确的方法。