gpt4 book ai didi

deep-learning - 了解 Keras 模型架构(嵌套模型的节点索引)

转载 作者:行者123 更新时间:2023-12-03 15:50:23 25 4
gpt4 key购买 nike

此脚本使用小型嵌套模型定义虚拟模型

from keras.layers import Input, Dense
from keras.models import Model
import keras

input_inner = Input(shape=(4,), name='input_inner')
output_inner = Dense(3, name='inner_dense')(input_inner)
inner_model = Model(inputs=input_inner, outputs=output_inner)

input = Input(shape=(5,), name='input')
x = Dense(4, name='dense_1')(input)
x = inner_model(x)
x = Dense(2, name='dense_2')(x)

output = keras.layers.concatenate([x, x], name='concat_1')
model = Model(inputs=input, outputs=output)

print(model.summary())

产生以下输出

Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
input (InputLayer) (None, 5) 0
____________________________________________________________________________________________________
dense_1 (Dense) (None, 4) 24 input[0][0]
____________________________________________________________________________________________________
model_1 (Model) (None, 3) 15 dense_1[0][0]
____________________________________________________________________________________________________
dense_2 (Dense) (None, 2) 8 model_1[1][0]
____________________________________________________________________________________________________
concat_1 (Concatenate) (None, 4) 0 dense_2[0][0]
dense_2[0][0]

我的问题是关于 Connected to的内容柱子。
我明白 a layer can have multiple nodes .

此列的符号是 layer_name[node_index][tensor_index] .

如果我们认为 inner_model作为一层,我希望它只有一个节点,所以我希望 dense_2连接到 model_1[0][0] .但实际上它连接到 model_1[1][0] .为什么会这样?

最佳答案

1.后台

当你说:

If we regard inner_model as a layer I would expect it to have only one node



这是真的,因为它只有一个节点 部分网络 .

考虑 github repositorymodel.summary功能。打印连接的函数是 print_layer_summary_with_connections (第 76 行),它只考虑来自 relevant_nodes 的节点大批。不在此数组中的所有节点都被视为 不属于网络 ,因此函数会跳过它们。相关的行是第 88-90 行:
if relevant_nodes and node not in relevant_nodes:
# node is not part of the current network
continue

2.您的型号

现在让我们看看您的特定模型会发生什么。首先让我们定义 relevant_nodes :
relevant_nodes = []
for v in model.nodes_by_depth.values():
relevant_nodes += v

数组 relevant_nodes好像:
[<keras.engine.topology.Node at 0x9dfa518>,
<keras.engine.topology.Node at 0x9dfa278>,
<keras.engine.topology.Node at 0x9d8bac8>,
<keras.engine.topology.Node at 0x9d8ba58>,
<keras.engine.topology.Node at 0x9d74518>]

但是,当我们在每一层打印入站节点时,我们将得到:
for i in model.layers:
print(i.inbound_nodes)

[<keras.engine.topology.Node object at 0x0000000009D74518>]
[<keras.engine.topology.Node object at 0x0000000009D8BA58>]
[<keras.engine.topology.Node object at 0x0000000009D743C8>, <keras.engine.topology.Node object at 0x0000000009D8BAC8>]
[<keras.engine.topology.Node object at 0x0000000009DFA278>]
[<keras.engine.topology.Node object at 0x0000000009DFA518>]

可以看到上面列表中正好有一个节点没有出现在 relevant_nodes中.这是第三个数组中位置 0 的节点:
<keras.engine.topology.Node object at 0x0000000009D743C8>

它不被认为是模型的一部分,因此没有出现在 relevant_nodes 中。 .此数组中位置 1 的节点确实出现在 relevant_nodes 中,这就是为什么您将其视为 model_1[1][0] .

3.原因

原因基本上是这条线 x=inner_model(input) .即使您运行更小的模型,如下所示:
input_inner = Input(shape=(4,), name='input_inner')
output_inner = Dense(3, name='inner_dense')(input_inner)
inner_model = Model(inputs=input_inner, outputs=output_inner)

input = Input(shape=(5,), name='input')
output = inner_model(input)

model = Model(inputs=input, outputs=output)

你会看到 relevant_nodes包含两个元素,而通过
for i in model.layers:
print(i.inbound_nodes)

你会得到三个节点。

这是因为第 1 层(上述较小模型的)有两个节点,但只有第二个节点被视为模型的一部分。特别是,如果您使用 layer.get_input_at(node_index) 在第 1 层的每个节点上打印输入, 你会得到:
print(model.layers[1].get_input_at(0))
print(model.layers[1].get_input_at(1))

#prints
/input_inner
/input

4.评论中问题的解答

1) Do you also know what this non-relevant node is good for / where it comes from?



这个节点好像是在 inner_model申请过程中创建的“内部节点” .特别是,如果在三个节点中的每一个节点上打印输入和输出形状(在上面的小模型中),您将得到:
nodes=[model.layers[0].inbound_nodes[0],model.layers[1].inbound_nodes[0],model.layers[1].inbound_nodes[1]]
for i in nodes:
print(i.input_shapes)
print(i.output_shapes)
print(" ")

#prints
[(None, 5)]
[(None, 5)]

[(None, 4)]
[(None, 3)]

[(None, 5)]
[(None, 3)]

所以你可以看到中间节点的形状(没有出现在相关节点列表中的那个)对应于 inner_model中的形状。 .

2) Will an inner model with n output nodes always present them with node indices 1 to n instead of 0 to n-1?



我不确定是否总是这样,因为我猜有多个输出节点节点的各种可能性,但是如果我考虑上面小模型的以下非常自然的概括,情况确实如此:
input_inner = Input(shape=(4,), name='input_inner')
output_inner = Dense(3, name='inner_dense')(input_inner)
inner_model = Model(inputs=input_inner, outputs=output_inner)

input = Input(shape=(5,), name='input')
output = inner_model(input)
output = inner_model(output)

model = Model(inputs=input, outputs=output)

print(model.summary())

这里我刚刚加了 output = inner_model(output)到小模型。相关节点的列表是
[<keras.engine.topology.Node at 0xd10c390>,
<keras.engine.topology.Node at 0xd10c9b0>,
<keras.engine.topology.Node at 0xd10ca20>]

并且所有入站节点的列表是
[<keras.engine.topology.Node object at 0x000000000D10CA20>]
[<keras.engine.topology.Node object at 0x000000000D10C588>, <keras.engine.topology.Node object at 0x000000000D10C9B0>, <keras.engine.topology.Node object at 0x000000000D10C390>]

正如您在评论中提到的,节点索引确实是 1 和 2。如果我添加另一个 output = inner_model(output),它会类似地继续,节点索引为 1,2,3 等。

关于deep-learning - 了解 Keras 模型架构(嵌套模型的节点索引),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46011749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com