Python 尝试使用.get_layer方法在Keras中创建模型时,图形断开连接
在普通代码中,我执行类似的操作,并且一切正常:Python 尝试使用.get_layer方法在Keras中创建模型时,图形断开连接,python,tensorflow,keras,neural-network,keras-layer,Python,Tensorflow,Keras,Neural Network,Keras Layer,在普通代码中,我执行类似的操作,并且一切正常: 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(
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)
然后它给出了以下错误:
图形已断开连接:无法获取张量的值
“input_4”层的张量(“input_4:0”,shape=(?,50),dtype=float32)。
访问以下以前的层时没有问题:[]
我的问题
但是,不应该是output
和network2.get\u layer('network2\u output')。output
是一样的吗?当我试着把它们都打印出来时,上面写着:
张量(“model_14/network2_output/BiasAdd:0”,shape=(?,1),dtype=float32)
及
张量(“网络2_输出_1/BiasAdd:0”,形状=(?,1),数据类型=浮点32)
而network2
已经连接到network1
的输出,我不明白为什么会断开连接。如何使代码与.get\u层
和输出
方法一起工作
我正在使用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>
本质上,network2.get\u output\u at(1)
相当于在此行中获得的output
:output=network2(network1.output)
不应为output和network2.get\u层('network2\u output')。output
同样的事情
不!,它们不是一回事。
让我解释一下这里发生了什么
network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)
首先创建两个模型,每个层有一个输入,然后用第一个模型的最后一个层输出替换第二个模型的输入。这样,您就可以将输出
变量的输入作为第一个模型的输入。因此,网络1.输入
和输出
连接起来。
但是在下一行中,network1.input
和network2.get\u层('network2\u output')。output
model = Model(network1.input, network2.get_layer('network2_output').output)
我现在明白了。如果我想得到中间层的输出呢?我找不到任何等价的
。get\u layer\u output\u at()
。只是好奇是否可以对中间层而不是最后的输出层做类似的事情。@RavenCheuk没有,因为您已经在network1.output
上应用了整个network2
模型,并且由于model
类继承自Keras中的layer
类,它可以单独应用于张量。此外,实现模型的调用方法,使得中间层的内部属性不被更新;相反,调用它们只是为了获得它们的输出。因此,我们只能访问模型的新符号输出,而不能访问模型中间层的符号输出。是否有可能强制新输入作为network2的唯一输入?我想通过将几个组件(1个函数1个组件)拼接在一起来创建我的神经网络。然而,我不确定这样做是否正确
model = Model(network1.input, network2.get_layer('network2_output').output)