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

2024-06-09 12:22:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在正常的代码中,我这样做,一切正常:

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属性,将最后一行代码替换为:

^{pr2}$

然后它会给出以下错误:

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和{}不是一回事吗?当我试图把它们都打印出来时,上面写着:

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。在


Tags: 代码namefromimportlayerinputoutputmake
2条回答

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和{}是连接的。 但是在下一行中,network1.input和{}之间没有联系

^{pr2}$

跑完这条线后:

output = network2(network1.output)

network2模型有两个计算流:一个是运行make_network2()时构造的原始流,另一个是在运行上述行时以network1.output作为输入的计算流。因此,它将有两个对应于这两个计算流的输出:

^{pr2}$

因此,当您要从network1.input转换到network2模型的输出时,必须使用连接到network1.input的第二个输出:

model = Model(network1.input, network2.get_output_at(1))

本质上,network2.get_output_at(1)相当于在这一行中获得的outputoutput = network2(network1.output)

相关问题 更多 >