Я знаю, что назначение переменных в 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.Это должна быть ветка (насколько я понимаю).Он продолжает работать с х.На «# для вывода значения» он запускает ветку, работающую с res_out.Очевидно, предполагается, что res_out является копией этого старого x в точке ветвления.В противном случае на самом деле нет необходимости в этой переменной.
Но разве res_out не указывает на тот же объект, что и x?Это будет означать, что существует фактически известная ветвь, просто дополнительный блок CNN.Существуют ли в python разные задания, которые иногда бывают глубокими, а иногда неглубокими?