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



通常我们使用外部数据提供用于训练的模型。但我想使用来自同一模型中间层的张量作为下一批的输入。 我相信这可以通过使用手动循环进行训练来实现。这一次,我更喜欢使用 Keras (v2.2.4( 中的 fit_generator((。我使用函数式 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)

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

请注意,在"第 1 部分"中,有一些层被"重用"。
虽然在"模型的其余部分"中,层不会"重用",但如果由于某种原因您需要在第二部分重用这些层,则应按照与"第 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 数组。

最新更新