keras model.summary中连接的层的“ [0] [0]”是什么意思?

时间:2018-12-27 08:57:25

标签: keras keras-layer

如下表所示,[0][0]中的input_1[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
___________________________________________________________________

1 个答案:

答案 0 :(得分:2)

这是一个好问题,但是要回答这个问题,我们必须深入探讨Keras中各层如何相互连接的内部原理。让我们开始吧:

0)什么是张量?

张量是表示数据的数据结构,它们基本上是n维数组。层之间传递的所有数据和信息都必须是张量。

1)什么是图层?

从最简单的意义上讲,层是一个计算单元,其中它获得一个或多个输入张量,然后对其施加一组运算(例如乘法,加法等),并给出结果是一个或多个输出张量。在某些输入张量上应用图层时,在引擎盖下会创建一个 Node

2)那么什么是节点?

为表示两层之间的连通性,Keras在内部使用Node类的对象。将图层应用于某些新输入时,将创建一个节点并将其添加到该图层的_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)很好!现在告诉我模型摘要的“已连接到”列中的那些值是什么意思?

为了更好地理解这一点,让我们创建一个简单的模型。首先,让我们创建两个输入层:

inp1 = Input((10,))
inp2 = Input((20,))

接下来,我们创建一个具有两个输出张量的Lambda层,第一个输出是输入张量除以2,第二个输出是输入张量乘以2:

lmb_layer = Lambda(lambda x: [x/2, x*2])

让我们在inp1inp2上应用此lambda层:

a1, b1 = lmb_layer(inp1)
a2, b2 = lmb_layer(inp2)

这样做之后,已经创建了两个节点并将它们添加到_inbound_nodes的{​​{1}}属性中:

lmb_layer

第一节点对应于>>> lmb_layer._inbound_nodes [<keras.engine.base_layer.Node at 0x7efb9a105588>, <keras.engine.base_layer.Node at 0x7efb9a105f60>] 与第一输入层(lmb_layer)的连通性,第二节点对应于该层与第二输入层({{1} }。此外,这些节点中的每个节点都有两个输出张量(对应于inp1inp2a1b1):

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 __________________________________________________________________________________________________ 对应于该层的输入张量来自的层。例如,所有layer_name[x][y]层都连接到layer_name,因此从该层获取其输入。 Dense分别对应于输入张量的节点索引(即lmb_layer)和张量索引(即[x][y])。例如:

  • node_indices层应用于tensor_indices的第一个(即索引:0)入站节点的第一个(即索引:0)输出张量dense_1 ,因此连通性显示为:a1

  • lmb_layer上应用lambda_1[0][0]层,它是dense_2的第一个(即索引:0)入站节点的第二个(即索引:1)输出张量,因此连通性显示为:b1

  • lmb_layer层应用于lambda_1[0][1]的第二个(即索引:1)入站节点的第一个(即索引:0)输出张量dense_3 ,因此连通性显示为:a2

  • lmb_layer层应用于lambda_1[1][0]的第一个(即索引:1)入站节点的第二个(即索引:1)输出张量dense_4 ,因此连通性显示为:b2


就是这样!如果您想进一步了解lmb_layer方法的工作原理,可以看看print_summary函数。而且,如果您想了解连接的打印方式,可以看看print_layer_summary_with_connections函数。