【问题标题】:What does the "[0][0]" of the layers connected to in keras model.summary mean?keras model.summary 中连接的层的“[0][0]”是什么意思?
【发布时间】:2019-05-25 07:41:32
【问题描述】:

如下表所示,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 keras-layer


    【解决方案1】:

    这是一个很好的问题,但是要回答这个问题,我们必须深入了解 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)
    

    完成此操作后,已创建两个节点并将其添加到lmb_layer_inbound_nodes 属性:

    >>> lmb_layer._inbound_nodes
    [<keras.engine.base_layer.Node at 0x7efb9a105588>,
     <keras.engine.base_layer.Node at 0x7efb9a105f60>]
    

    第一个节点对应于lmb_layer 与第一个输入层 (inp1) 的连通性,第二个节点对应于该层与第二个输入层 (inp2) 的连通性。此外,每个节点都有两个输出张量(对应于a1b1a2b2):

    >>> 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)。例如:

    • dense_1 层应用于a1,这是lmb_layer 的第一个(即索引:0)入站节点的第一个(即索引:0)输出张量,因此显示连通性如:lambda_1[0][0]

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

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

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


    就是这样!如果您想了解更多summary 方法的工作原理,可以查看print_summary 函数。如果您想了解连接是如何打印的,可以查看print_layer_summary_with_connections 函数。

    【讨论】:

      猜你喜欢
      • 2018-04-24
      • 2015-03-20
      • 2018-09-10
      • 2020-01-07
      • 2016-06-03
      • 2020-04-02
      • 2014-11-06
      • 2018-09-25
      相关资源
      最近更新 更多