首页 > 解决方案 > 理解 Keras 模型中的 Python 变量赋值

问题描述

我知道 python 中的变量赋值与 C 或 C++ 中的不同。这篇文章展示了如何一次创建乘法变量。但是,它们都指向同一个对象。今天我研究了一些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 合作。在“# for value output”处,他开始使用 res_out 的分支。显然,假定 res_out 是分支点处旧 x 的副本。否则实际上不需要这个变量。

但是 res_out 不是和 x 指向同一个对象吗?这意味着实际上存在已知分支,只是一个额外的 CNN 块。python中是否有不同的任务,有时是深拷贝,有时是浅拷贝?

标签: pythoncopyvariable-assignment

解决方案


推荐阅读