了解Keras模型中的Python变量分配

时间:2018-12-11 20:29:13

标签: python copy variable-assignment

我知道python中的变量赋值与C或C ++中的变量赋值不同。 post显示了如何立即创建乘法变量。但是,它们都指向同一个对象。今天,我研究了一些GitHub代码,并遇到了这个问题:

    in_x = x = Input((2, 6, 7))  # [own(8x8), enemy(8x8)]

    # (batch, channels, height, width)
    x = Conv2D(filters=mc.cnn_filter_num, kernel_size=mc.cnn_filter_size, padding="same",
               data_format="channels_first", kernel_regularizer=l2(mc.l2_reg))(x)
    x = BatchNormalization(axis=1)(x)
    x = Activation("relu")(x)

    for _ in range(mc.res_layer_num):
        x = self._build_residual_block(x)

    res_out = x
    # for policy output
    x = Conv2D(filters=2, kernel_size=1, data_format="channels_first", kernel_regularizer=l2(mc.l2_reg))(res_out)
    x = BatchNormalization(axis=1)(x)
    x = Activation("relu")(x)
    x = Flatten()(x)
    # no output for 'pass'
    policy_out = Dense(self.config.n_labels, kernel_regularizer=l2(mc.l2_reg), activation="softmax", name="policy_out")(x)

    # for value output
    x = Conv2D(filters=1, kernel_size=1, data_format="channels_first", kernel_regularizer=l2(mc.l2_reg))(res_out)
    x = BatchNormalization(axis=1)(x)
    x = Activation("relu")(x)
    x = Flatten()(x)
    x = Dense(mc.value_fc_size, kernel_regularizer=l2(mc.l2_reg), activation="relu")(x)
    value_out = Dense(1, kernel_regularizer=l2(mc.l2_reg), activation="tanh", name="value_out")(x)

这是深度学习问题的Keras模型。上下文无关紧要。大致如下。输入x通过带有CNN层的两个分支传递。因此最终将有两个损失。现在到实际的问题。

作者在中间创建变量res_out并为其分配x。这应该是分支(据我所知)。他继续使用x。在“#输出值”处,他使用res_out启动分支。 显然,假设res_out是该旧x在分支点的副本。否则,实际上就不需要此变量。

但是res_out是否指向与x相同的对象?这意味着实际上有一个已知分支,只是一个附加的CNN块。 python中是否有不同的作业,有时是较深的拷贝,有时是较浅的拷贝?

0 个答案:

没有答案