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

标签 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)

然后它给了我以下错误:

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: []

我的问题

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

最佳答案

运行此行后:

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模型的输出时,必须使用连接到的第二个输出网络1.输入:

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

本质上,network2.get_output_at(1) 相当于在以下行中获得的output:output = network2(network1.output)

关于python - 尝试使用 .get_layer 方法在 Keras 中创建模型时图形断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53986725/

相关文章:

c++ - 即使启用了 Visual Studio 14 2015 Win64 工具链,也使用 32 位工具链进行编译

python - tensorflow 层 basic_lstm_cell_1 的 LSTM 输入 0

python - 使用 class_weight 来不平衡数据-.fit_generator()

python - pymysql无法连接到mysql

tensorflow - Tensorflow 中的 8 位量化错误

python - Keras model.predict 始终为 0

Tensorflow、Keras : In a multi-class classification, 准确率很高,但大多数类别的准确率、召回率和 f1-score 为零

python - 我如何将 flask-admin column_sortable_list 与数据库关系一起使用

python - 如何用 Pythonese 说 - 做某事,除非它导致错误(不诉诸多级 try/execpt block )

python - 我如何在 gae 的子文件夹中使用脚本?