通常,我们会提供一个用于训练外部数据的模型。但是我想将来自同一模型中间层的张量用作下一批的输入。 我相信可以通过使用手动循环进行培训来实现。这次,我更喜欢使用Keras(v2.2.4)中的fit_generator()。我使用Functional API创建模式。
感谢您的帮助。谢谢。
答案 0 :(得分:0)
一种非常简单的方法是在您自己的模型中进行循环:
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部分”相同的方式进行操作。
答案 1 :(得分:0)
这就是我解决问题的方式。
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数组。