如何在Keras中为卷积层添加跳跃连接

3
我想在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个回答

3
你不能添加不同形状的张量。您可以使用keras.layers.Concatenate将它们连接起来,但这会使您得到一个形状为[None, None, 35]的张量。
或者,看一下Keras中的Resnet50实现。他们的残差块在快捷方式中具有1x1xC卷积,用于那些要添加的维度不同的情况。

好像还是有问题。我实现了类似Resnet50的东西:[https://www.codepile.net/pile/KAqdVpmG]在运行时出现以下错误:tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [16,46,46,8] vs. [16,48,48,8]有什么想法吗? - atlas
虽然通道数量现在匹配,但空间维度不匹配(46 vs 48)。您可以在res_block中的卷积和/或池化层中设置padding='same' - mrks
是的,每个卷积层中都有“same”。 - atlas
好的,你的“res_block”确实会在每个边缘削减一个像素…(顺便说一下,我在你的代码链接中没有看到任何东西)。 - mrks
是的,显然有些东西正在这样做。我也添加了res_block代码。抱歉,这个链接可能更好用:https://www.codepile.net/pile/W6K594e0 - atlas
我的错!我错过了在残差块之前和之后添加了两个卷积层,并使用了“valid”填充。我将它们更新为“same”,现在它可以工作了。谢谢你的帮助! - atlas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接