尝试使用 .get_layer 方法在 Keras 中创建模型时图形断开连接
Graph disconnected when trying to create models in Keras with .get_layer method
在正常的代码中,我做了这样的事情,一切正常:
from keras.layers import Input, Dense
from keras.models import Model
import keras.backend as K
import numpy as np
import tensorflow as tf
from sklearn.datasets import make_blobs
X, y = make_blobs(500,50,2)
def make_network1():
input_layer = Input((50,))
layer1 = Dense(100,name='network1_dense1')(input_layer)
output = Dense(50,name='network1_dense2')(layer1)
model = Model(input_layer,output)
return model
def make_network2():
input_layer = Input((50,))
layer1 = Dense(100,name='network2_dense1')(input_layer)
output = Dense(1,name='network2_output')(layer1)
model = Model(input_layer,output)
return model
network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)
model = Model(network1.input, output)
现在,我想在 Keras 中试验 .get_layer
方法和 .output
属性,方法是将最后一行代码替换为:
model = Model(network1.input, network2.get_layer('network2_output').output)
然后它给了我以下错误:
Graph disconnected: cannot obtain value for tensor
Tensor("input_4:0", shape=(?, 50), dtype=float32) at layer "input_4".
The following previous layers were accessed without issue: []
我的问题
但是,output
和network2.get_layer('network2_output').output
不应该是一回事吗?当我尝试将它们都打印出来时,它说:
Tensor("model_14/network2_output/BiasAdd:0", shape=(?, 1), dtype=float32)
和
Tensor("network2_output_1/BiasAdd:0", shape=(?, 1), dtype=float32)
并且network2
已经连接到network1
的输出,我不明白为什么它会断开连接。如何使代码与 .get_layer
和 .output
方法一起工作?
我正在使用 keras==2.24 和 tensorflow-gpu==1.5。
在运行这一行之后:
output = network2(network1.output)
network2
模型有两种计算流程:一种是运行make_network2()
时构建的原始计算流程,另一种是以network1.output
为输入的计算流程当运行以上一行时构造。因此,它将有两个输出对应于这两个计算流程中的每一个:
>>> network2.get_output_at(0)
<tf.Tensor 'network2_output_4/BiasAdd:0' shape=(?, 1) dtype=float32>
>>> network2.get_output_at(1)
<tf.Tensor 'model_14/network2_output/BiasAdd:0' shape=(?, 1) dtype=float32>
因此,当您想从 network1.input
转到 network2
模型的输出时,您必须使用连接到 network1.input
的第二个输出:
model = Model(network1.input, network2.get_output_at(1))
本质上,network2.get_output_at(1)
等同于output
这一行得到的:output = network2(network1.output)
.
shouldn't be output and network2.get_layer('network2_output').output
the same thing?
不!它们不是一回事。
让我解释一下这里发生了什么
network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)
首先,您要创建两个模型,每一层都有一个输入,然后用第一个模型的最后一层输出替换第二个模型的输入。这样您就可以将 output
变量的输入作为第一个模型的输入。所以 network1.inputs
和 output
是相连的。
但是在下一行 network1.input
和 network2.get_layer('network2_output').output
之间没有联系
model = Model(network1.input, network2.get_layer('network2_output').output)
在正常的代码中,我做了这样的事情,一切正常:
from keras.layers import Input, Dense
from keras.models import Model
import keras.backend as K
import numpy as np
import tensorflow as tf
from sklearn.datasets import make_blobs
X, y = make_blobs(500,50,2)
def make_network1():
input_layer = Input((50,))
layer1 = Dense(100,name='network1_dense1')(input_layer)
output = Dense(50,name='network1_dense2')(layer1)
model = Model(input_layer,output)
return model
def make_network2():
input_layer = Input((50,))
layer1 = Dense(100,name='network2_dense1')(input_layer)
output = Dense(1,name='network2_output')(layer1)
model = Model(input_layer,output)
return model
network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)
model = Model(network1.input, output)
现在,我想在 Keras 中试验 .get_layer
方法和 .output
属性,方法是将最后一行代码替换为:
model = Model(network1.input, network2.get_layer('network2_output').output)
然后它给了我以下错误:
Graph disconnected: cannot obtain value for tensor Tensor("input_4:0", shape=(?, 50), dtype=float32) at layer "input_4". The following previous layers were accessed without issue: []
我的问题
但是,output
和network2.get_layer('network2_output').output
不应该是一回事吗?当我尝试将它们都打印出来时,它说:
Tensor("model_14/network2_output/BiasAdd:0", shape=(?, 1), dtype=float32)
和
Tensor("network2_output_1/BiasAdd:0", shape=(?, 1), dtype=float32)
并且network2
已经连接到network1
的输出,我不明白为什么它会断开连接。如何使代码与 .get_layer
和 .output
方法一起工作?
我正在使用 keras==2.24 和 tensorflow-gpu==1.5。
在运行这一行之后:
output = network2(network1.output)
network2
模型有两种计算流程:一种是运行make_network2()
时构建的原始计算流程,另一种是以network1.output
为输入的计算流程当运行以上一行时构造。因此,它将有两个输出对应于这两个计算流程中的每一个:
>>> network2.get_output_at(0)
<tf.Tensor 'network2_output_4/BiasAdd:0' shape=(?, 1) dtype=float32>
>>> network2.get_output_at(1)
<tf.Tensor 'model_14/network2_output/BiasAdd:0' shape=(?, 1) dtype=float32>
因此,当您想从 network1.input
转到 network2
模型的输出时,您必须使用连接到 network1.input
的第二个输出:
model = Model(network1.input, network2.get_output_at(1))
本质上,network2.get_output_at(1)
等同于output
这一行得到的:output = network2(network1.output)
.
shouldn't be output and network2.get_layer('network2_output').output the same thing?
不!它们不是一回事。 让我解释一下这里发生了什么
network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)
首先,您要创建两个模型,每一层都有一个输入,然后用第一个模型的最后一层输出替换第二个模型的输入。这样您就可以将 output
变量的输入作为第一个模型的输入。所以 network1.inputs
和 output
是相连的。
但是在下一行 network1.input
和 network2.get_layer('network2_output').output
model = Model(network1.input, network2.get_layer('network2_output').output)