Понимание назначения переменных Python в модели Keras - PullRequest
0 голосов
/ 11 декабря 2018

Я знаю, что назначение переменных в 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 разные задания, которые иногда бывают глубокими, а иногда неглубокими?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...