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

Tensorflow 将中间层的输出作为模型训练的输入,tensorflow,input,keras,model,training-data,Tensorflow,Input,Keras,Model,Training Data,通常我们用外部数据提供训练模型。但我想使用来自同一模型中间层的张量作为下一批的输入。 我相信这可以通过使用手动回路进行训练来实现。这次,我更喜欢使用Keras(v2.2.4)中的fit_generator()。我使用函数API创建了一个模式 谢谢你的帮助。谢谢。一个非常简单的方法是在您自己的模型中创建循环: inputs = Input(...) #part 1 layers: layer1 = SomeLayer(...) layer2 = SomeLayer(...) layer3 = S

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

您的\u中间\u层\u out
是我在模特训练期间寻找的一个小数组。

这是“始终”吗?你总是希望中间层重新开始?@DanielMöller for training:是的。但是,我不需要预测/评估的输出,我实际上尝试使用更简单的方法实现这个源()。您可以看到,
隐藏状态
再次被使用。我很不确定你的解决方案能否解决我的问题。我从Keras docs上读到它有一个关于批处理()的训练,我想知道这个函数是否符合我的期望,你能看看这里吗?也许这与你解决的问题有关,你会很感激你的投入。