Ошибка значения Tensorflow: операнды не могут передаваться вместе с фигурами (5, 5, 160) (19, 19, 80) - PullRequest
0 голосов
/ 07 марта 2020

Я создавал CNN размером 80 для первого скрытого слоя, 160 для остальных слоев конвоя и 128 для последнего скрытого слоя. Но я продолжаю сталкиваться с сообщением об ошибке, и я действительно не знаю, что это значит. Форма входных данных (80, 80, 1) - это то, что я передаю в нейронную сеть.

Вот код для создания CNN:

    if start_model is not None:
        model = load_model(start_model)
    else:
        def res_net_block(input_layers, conv_size, hm_filters, hm_strides):
            x = Conv2D(conv_size, kernel_size=hm_filters, strides=hm_strides, activation="relu", padding="same")(input_layers)
            x = BatchNormalization()(x)
            x = Conv2D(conv_size, kernel_size=hm_filters, strides=hm_strides, activation=None, padding="same")(x)
            x = Add()([x, input_layers])  # Creates resnet block
            x = Activation("relu")(x)
            return x

        input = keras.Input(i_shape)
        x = Conv2D(80, kernel_size=8, strides=4, activation="relu")(input)
        x = BatchNormalization()(x)

        for i in range(3):
            x = res_net_block(x, 160, 4, 2)

        x = Conv2D(160, kernel_size=4, strides=2, activation="relu")(x)
        x = BatchNormalization()(x)

        x = Flatten(input_shape=(np.prod(window_size), 1, 1))(x)

        x = Dense(128, activation="relu")(x)

        output = Dense(action_space_size, activation="linear")(x)

        model = keras.Model(input, output)

        model.compile(optimizer=Adam(lr=0.01), loss="mse", metrics=["accuracy"])

Кстати, сообщение об ошибке находится в x = Add()([x, input_layers]) в коде

1 Ответ

1 голос
/ 07 марта 2020

Если применить свертку с kernel_size> 1 и strides> 1, выход будет иметь меньший размер, чем вход.

Например:

Conv2D(filters=6, kernel_size=5, stride=2)

Взял бы вход измерения (32,32,1) и дал бы вывод измерения (28,28,6). Это вызывает проблему, если вы попытаетесь добавить это в блок ярлыков в стиле Re sNet, поскольку неясно, как добавить тензоры разных измерений.

Существует несколько способов справиться с этим.

  • Не уменьшать размер от свертки (keep stride = 1)
  • Уменьшить размер блока ярлыков, используя сверточное ядро ​​1x1 с тем же шагом как используется в Conv2D
  • Измените количество выходных каналов блока ярлыков на количество фильтров в Conv2D
...