keras model.summary中连接的层的“[0][0]”是什么意思?
What does the "[0][0]" of the layers connected to in keras model.summary mean?
如下图table,input_1[0][0]
的[0][0]
是什么意思?
__________________________________________________
Layer (type) Output Shape Param # Connected to
===================================================================
input_1 (InputLayer) (None, 1) 0
___________________________________________________________________
dropout_1 (Dropout) (None, 1) 0 input_1[0][0]
___________________________________________________________________
dropout_2 (Dropout) (None, 1) 0 input_1[0][0]
===================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
___________________________________________________________________
这是一个很好的问题,但要回答这个问题,我们必须深入了解 Keras 中各层之间的连接方式。那么让我们开始吧:
0) 什么是张量?
张量是一种表示数据的数据结构,它们基本上是 n 维数组。层与层之间传递的所有数据和信息都必须是张量。
1)什么是图层?
在最简单的意义上,层是一个计算单元,它获取一个或多个输入张量,然后应用一组运算(例如乘法、加法等)在它们上,并以一个或多个 输出张量 的形式给出结果。当你在一些输入张量上应用一个层时,在引擎盖下创建了一个 Node。
2) 那么什么是节点?
为了表示两层之间的连通性,Keras 内部使用了一个 Node
class 的对象。当一个层应用于某个新输入时,将创建一个节点并将其添加到该层的 _inbound_nodes
属性。此外,当一个层的输出被另一层使用时,将创建一个新节点并将其添加到该层的 _outbound_nodes
属性。所以从本质上讲,这个数据结构让 Keras 可以使用 Node
:
类型的对象的以下属性来找出层是如何相互连接的
input_tensors
:是一个包含节点输入张量的列表。
output_tensors
:它是一个包含节点输出张量的列表。
inbound_layers
:这是一个列表,其中包含 input_tensors
来自的层。
outbound_layers
:消费者层,即将 input_tensors
转换为 output_tensors
. 的层
node_indices
:它是一个整数列表,其中包含 input_tensors
的节点索引(将在以下问题的答案中对此进行更多解释)。
tensor_indices
:它是一个整数列表,其中包含 input_tensors
在其相应入站层中的索引(将在以下问题的答案中对此进行更多解释)。
3) 很好!现在告诉我模型摘要的 "Connected to" 列中的那些值是什么意思?
为了更好地理解这一点,让我们创建一个简单的模型。首先,让我们创建两个输入层:
inp1 = Input((10,))
inp2 = Input((20,))
接下来,我们创建一个Lambda
层,它有两个输出张量,第一个输出是输入张量除以2,第二个输出是输入张量乘以2:
lmb_layer = Lambda(lambda x: [x/2, x*2])
让我们在 inp1
和 inp2
上应用此 lambda 层:
a1, b1 = lmb_layer(inp1)
a2, b2 = lmb_layer(inp2)
执行此操作后,已创建两个节点并添加到 _inbound_nodes
属性 of lmb_layer
:
>>> lmb_layer._inbound_nodes
[<keras.engine.base_layer.Node at 0x7efb9a105588>,
<keras.engine.base_layer.Node at 0x7efb9a105f60>]
第一个节点对应lmb_layer
与第一输入层(inp1
)的连通性,第二个节点对应该层与第二输入层(inp2
).此外,每个节点都有两个输出张量(对应于 a1
、b1
和 a2
、b2
):
>>> lmb_layer._inbound_nodes[0].output_tensors
[<tf.Tensor 'lambda_1/truediv:0' shape=(?, 10) dtype=float32>,
<tf.Tensor 'lambda_1/mul:0' shape=(?, 10) dtype=float32>]
>>> lmb_layer._inbound_nodes[1].output_tensors
[<tf.Tensor 'lambda_1_1/truediv:0' shape=(?, 20) dtype=float32>,
<tf.Tensor 'lambda_1_1/mul:0' shape=(?, 20) dtype=float32>]
现在,让我们创建并应用四个不同的 Dense
层,并将它们应用到我们获得的四个输出张量上:
d1 = Dense(10)(a1)
d2 = Dense(20)(b1)
d3 = Dense(30)(a2)
d4 = Dense(40)(b2)
model = Model(inputs=[inp1, inp2], outputs=[d1, d2, d3, d4])
model.summary()
模型摘要如下所示:
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, 10) 0
__________________________________________________________________________________________________
input_2 (InputLayer) (None, 20) 0
__________________________________________________________________________________________________
lambda_1 (Lambda) multiple 0 input_1[0][0]
input_2[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (None, 10) 110 lambda_1[0][0]
__________________________________________________________________________________________________
dense_2 (Dense) (None, 20) 220 lambda_1[0][1]
__________________________________________________________________________________________________
dense_3 (Dense) (None, 30) 630 lambda_1[1][0]
__________________________________________________________________________________________________
dense_4 (Dense) (None, 40) 840 lambda_1[1][1]
==================================================================================================
Total params: 1,800
Trainable params: 1,800
Non-trainable params: 0
__________________________________________________________________________________________________
在图层的 "Connected to" 列中,值的格式为:layer_name[x][y]
。 layer_name
对应该层的输入张量来自的层。例如,所有 Dense
层都连接到 lmb_layer
,因此从该层获取输入。 [x][y]
分别对应输入张量的节点索引(即node_indices
)和张量索引(即tensor_indices
)。例如:
dense_1
层应用于a1
,这是[的第一个(即索引:0)入站节点的第一个(即索引:0)输出张量=36=],因此连接显示为:lambda_1[0][0]
.
dense_2
层应用于b1
,这是[的第一个(即索引:0)入站节点的第二个(即索引:1)输出张量=36=],因此连接显示为:lambda_1[0][1]
.
dense_3
层应用于a2
,这是[的第一个(即索引:0)输出张量的第二个(即索引:1)入站节点=36=],因此连接显示为:lambda_1[1][0]
.
dense_4
层应用于b2
,这是[的第一个(即索引:1)入站节点的第二个(即索引:1)输出张量=36=],因此连接显示为:lambda_1[1][1]
.
就是这样!如果您想了解更多 summary
方法的工作原理,可以查看 print_summary
function. And if you want to find out how the connections are printed, you can take a look at the print_layer_summary_with_connections
函数。
如下图table,input_1[0][0]
的[0][0]
是什么意思?
__________________________________________________
Layer (type) Output Shape Param # Connected to
===================================================================
input_1 (InputLayer) (None, 1) 0
___________________________________________________________________
dropout_1 (Dropout) (None, 1) 0 input_1[0][0]
___________________________________________________________________
dropout_2 (Dropout) (None, 1) 0 input_1[0][0]
===================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
___________________________________________________________________
这是一个很好的问题,但要回答这个问题,我们必须深入了解 Keras 中各层之间的连接方式。那么让我们开始吧:
0) 什么是张量?
张量是一种表示数据的数据结构,它们基本上是 n 维数组。层与层之间传递的所有数据和信息都必须是张量。
1)什么是图层?
在最简单的意义上,层是一个计算单元,它获取一个或多个输入张量,然后应用一组运算(例如乘法、加法等)在它们上,并以一个或多个 输出张量 的形式给出结果。当你在一些输入张量上应用一个层时,在引擎盖下创建了一个 Node。
2) 那么什么是节点?
为了表示两层之间的连通性,Keras 内部使用了一个 Node
class 的对象。当一个层应用于某个新输入时,将创建一个节点并将其添加到该层的 _inbound_nodes
属性。此外,当一个层的输出被另一层使用时,将创建一个新节点并将其添加到该层的 _outbound_nodes
属性。所以从本质上讲,这个数据结构让 Keras 可以使用 Node
:
input_tensors
:是一个包含节点输入张量的列表。output_tensors
:它是一个包含节点输出张量的列表。inbound_layers
:这是一个列表,其中包含input_tensors
来自的层。outbound_layers
:消费者层,即将input_tensors
转换为output_tensors
. 的层
node_indices
:它是一个整数列表,其中包含input_tensors
的节点索引(将在以下问题的答案中对此进行更多解释)。tensor_indices
:它是一个整数列表,其中包含input_tensors
在其相应入站层中的索引(将在以下问题的答案中对此进行更多解释)。
3) 很好!现在告诉我模型摘要的 "Connected to" 列中的那些值是什么意思?
为了更好地理解这一点,让我们创建一个简单的模型。首先,让我们创建两个输入层:
inp1 = Input((10,))
inp2 = Input((20,))
接下来,我们创建一个Lambda
层,它有两个输出张量,第一个输出是输入张量除以2,第二个输出是输入张量乘以2:
lmb_layer = Lambda(lambda x: [x/2, x*2])
让我们在 inp1
和 inp2
上应用此 lambda 层:
a1, b1 = lmb_layer(inp1)
a2, b2 = lmb_layer(inp2)
执行此操作后,已创建两个节点并添加到 _inbound_nodes
属性 of lmb_layer
:
>>> lmb_layer._inbound_nodes
[<keras.engine.base_layer.Node at 0x7efb9a105588>,
<keras.engine.base_layer.Node at 0x7efb9a105f60>]
第一个节点对应lmb_layer
与第一输入层(inp1
)的连通性,第二个节点对应该层与第二输入层(inp2
).此外,每个节点都有两个输出张量(对应于 a1
、b1
和 a2
、b2
):
>>> lmb_layer._inbound_nodes[0].output_tensors
[<tf.Tensor 'lambda_1/truediv:0' shape=(?, 10) dtype=float32>,
<tf.Tensor 'lambda_1/mul:0' shape=(?, 10) dtype=float32>]
>>> lmb_layer._inbound_nodes[1].output_tensors
[<tf.Tensor 'lambda_1_1/truediv:0' shape=(?, 20) dtype=float32>,
<tf.Tensor 'lambda_1_1/mul:0' shape=(?, 20) dtype=float32>]
现在,让我们创建并应用四个不同的 Dense
层,并将它们应用到我们获得的四个输出张量上:
d1 = Dense(10)(a1)
d2 = Dense(20)(b1)
d3 = Dense(30)(a2)
d4 = Dense(40)(b2)
model = Model(inputs=[inp1, inp2], outputs=[d1, d2, d3, d4])
model.summary()
模型摘要如下所示:
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, 10) 0
__________________________________________________________________________________________________
input_2 (InputLayer) (None, 20) 0
__________________________________________________________________________________________________
lambda_1 (Lambda) multiple 0 input_1[0][0]
input_2[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (None, 10) 110 lambda_1[0][0]
__________________________________________________________________________________________________
dense_2 (Dense) (None, 20) 220 lambda_1[0][1]
__________________________________________________________________________________________________
dense_3 (Dense) (None, 30) 630 lambda_1[1][0]
__________________________________________________________________________________________________
dense_4 (Dense) (None, 40) 840 lambda_1[1][1]
==================================================================================================
Total params: 1,800
Trainable params: 1,800
Non-trainable params: 0
__________________________________________________________________________________________________
在图层的 "Connected to" 列中,值的格式为:layer_name[x][y]
。 layer_name
对应该层的输入张量来自的层。例如,所有 Dense
层都连接到 lmb_layer
,因此从该层获取输入。 [x][y]
分别对应输入张量的节点索引(即node_indices
)和张量索引(即tensor_indices
)。例如:
dense_1
层应用于a1
,这是[的第一个(即索引:0)入站节点的第一个(即索引:0)输出张量=36=],因此连接显示为:lambda_1[0][0]
.dense_2
层应用于b1
,这是[的第一个(即索引:0)入站节点的第二个(即索引:1)输出张量=36=],因此连接显示为:lambda_1[0][1]
.dense_3
层应用于a2
,这是[的第一个(即索引:0)输出张量的第二个(即索引:1)入站节点=36=],因此连接显示为:lambda_1[1][0]
.dense_4
层应用于b2
,这是[的第一个(即索引:1)入站节点的第二个(即索引:1)输出张量=36=],因此连接显示为:lambda_1[1][1]
.
就是这样!如果您想了解更多 summary
方法的工作原理,可以查看 print_summary
function. And if you want to find out how the connections are printed, you can take a look at the print_layer_summary_with_connections
函数。