Как добавить пропущенную связь между сверточными слоями в Keras - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы добавить пропускаемое соединение между остаточными блоками в кератах.Это моя текущая реализация, которая не работает, потому что тензоры имеют разные формы.

Функция выглядит следующим образом:

def build_res_blocks(net, x_in, num_res_blocks, res_block, num_filters, res_block_expansion, kernel_size, scaling):
    net_next_in = net
    for i in range(num_res_blocks):
        net = res_block(net_next_in, num_filters, res_block_expansion, kernel_size, scaling)

        # net tensor shape: (None, None, 32)
        # x_in tensor shape: (None, None, 3)
        # Error here, net_next_in should be in the shape of (None, None, 32) to be fed into next layer
        net_next_in = Add()([net, x_in]) 

    return net

Я получаю ошибку: ValueError: Operands could not be broadcast together with shapes (None, None, 32) (None, None, 3)

Мой вопрос заключается в том, как вы могли бы добавить или объединить эти тензоры в правильную форму (None, None, 32).Если это неправильный подход, как вы могли бы достичь желаемого результата?

РЕДАКТИРОВАТЬ:

Вот как выглядит res_block:

def res_block(x_in, num_filters, expansion, kernel_size, scaling):
    x = Conv2D(num_filters * expansion, kernel_size, padding='same')(x_in)
    x = Activation('relu')(x)
    x = Conv2D(num_filters, kernel_size, padding='same')(x)
    x = Add()([x_in, x])
return x

1 Ответ

0 голосов
/ 21 февраля 2019

Нельзя добавлять тензоры различной формы.Вы можете объединить их с keras.layers.Concatenate , но это даст вам тензор формы [None, None, 35].

В качестве альтернативы взгляните на Resnet50 Реализация в Керасе.Их остаточный блок имеет свертку 1x1xC в ярлыке для тех случаев, когда размеры должны быть добавлены.

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