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