将中间层的输出作为模型训练的输入

Take output of intermediate layer as input for model training

通常我们使用外部数据训练模型。但我想使用来自同一模型中间层的张量作为下一批的输入。 我相信这可以通过使用手动循环进行训练来实现。这次,我更喜欢使用 Keras (v2.2.4) 中的 fit_generator() 。我使用 Functional API.

创建了一个模式

感谢任何帮助。谢谢。

一个非常简单的方法是在您自己的模型中创建循环:

inputs = Input(...)

#part 1 layers:
layer1 = SomeLayer(...)
layer2 = SomeLayer(...)
layer3 = SomeLayer(...)
intermediateLayer = IntermediateLayer(...)

#first pass:
out = layer1(inputs)
out = layer2(out)
out = layer3(out)
intermediate_out = intermediateLayer(out)

#second pass:
out = layer1(intermediate_out)
out = layer2(out)
out = layer3(out)
second_pass_out = intermediateLayer(out)

#rest of the model - you decide wheter you need the first pass or only the second
out = SomeLayer(...)(second_pass_out)
out = SomeLayer(...)(out)
...
final_out = FinalLayer(...)(out)

模型然后去:

model = Model(inputs, final_out)

您可以根据自己的目的,只让第二遍参与训练,阻止来自第一遍的梯度。

#right after intermediate_out, before using it 
intermediate_out = Lambda(lambda x: K.stop_gradients(x))(intermediate_out)

您还可以创建更多共享这些层的模型,并将每个模型用于一个目的,同时它们将始终一起更新(因为它们使用相同的层)。

请注意,在 "part 1" 中,有层获得 "reused"。
虽然在 "rest of the model" 中图层不是 "reused",但如果出于某种原因您需要在第二部分中重复使用图层,您应该按照与 "part 1" 相同的方式进行操作。

这就是我解决问题的方法。

model.compile(optimizer=optimizer, loss=loss, metrics=metrics)
model.metrics_tensors =+ [self.model.get_layer('your_intermediate_layer').output]   # This line is to access the output of a layer during training (what I want)

然后这样训练:

loss_out, ...., your_intermediate_layer_out = model.train_on_batch(X, y)

your_intermediate_layer_out 是我在模型训练期间寻找的 numpy 数组。