Как добавить пропущенную связь между сверточными слоями в Keras
Я хотел бы добавить пропустить соединение между остаточными блоками в керасах. Это моя текущая реализация, которая не работает, потому что тензоры имеют разные формы.
Функция выглядит так:
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 ответ
Вы не можете добавить тензоры различной формы. Вы можете объединить их с keras.layers.Concatenate, но это даст вам тензор формы [None, None, 35]
,
Кроме того, взгляните на реализацию Resnet50 в Keras. Их остаточный блок имеет свертку 1x1xC в ярлыке для тех случаев, когда добавляемые размеры отличаются.