尝试使用.get_layer方法在Keras中创建模型时,图形断开连接

时间:2018-12-31 11:06:33

标签: 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():
    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”层的Tensor(“ input_4:0”,shape =(?, 50),dtype = float32)。   可以顺利访问以下先前的图层:[]

我的问题

但是,outputnetwork2.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。

2 个答案:

答案 0 :(得分:1)

运行此行之后:

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)等同于在以下行中获得的outputoutput = network2(network1.output)

答案 1 :(得分:1)

  

不应该输出和network2.get_layer('network2_output')。output   同一件事?

不!他们不是一回事。 让我解释一下这里发生的事情

network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)

首先要创建两个模型,每个层有一个输入,然后用第一个模型的最后一层输出替换第二个模型的输入。这样,您将output变量的输入作为第一个模型的输入。因此network1.inputsoutput已连接。 但是在下一行,network1.inputnetwork2.get_layer('network2_output').output

之间没有连接
model = Model(network1.input, network2.get_layer('network2_output').output)