通道编号增加时,ResNet快捷键连接的零填充

时间:2016-05-04 14:45:14

标签: python theano keras

我想在Keras中实现ResNet网络,其快捷连接在功能/通道尺寸根据原始纸张不匹配时添加零条目:

  

当尺寸增加时(图3中的虚线快捷键),我们   考虑两个选项:(A)快捷方式仍然执行身份   映射,加上额外的零条目以增加维度...   http://arxiv.org/pdf/1512.03385v1.pdf

然而无法实现它,我似乎无法在网络或源代码上找到答案。我发现的所有实现都在尺寸不匹配时使用1x1卷积技巧进行快捷连接。

我想要实现的层基本上将输入张量连接到具有全零张量的张量,以补偿尺寸不匹配。

这个想法会是这样的,但我无法让它发挥作用:

def zero_pad(x, shape):
    return K.concatenate([x, K.zeros(shape)], axis=1)

有没有人知道如何实现这样的图层?

非常感谢

3 个答案:

答案 0 :(得分:2)

github上回答了这个问题: https://github.com/fchollet/keras/issues/2608

这将是这样的:

from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Lambda
from keras import backend as K


def zeropad(x):
    y = K.zeros_like(x)
    return K.concatenate([x, y], axis=1)


def zeropad_output_shape(input_shape):
    shape = list(input_shape)
    assert len(shape) == 4
    shape[1] *= 2
    return tuple(shape)


def shortcut(input_layer, nb_filters, output_shape, zeros_upsample=True):
    # TODO: Figure out why zeros_upsample doesn't work in Theano
    if zeros_upsample:
        x = MaxPooling2D(pool_size=(1,1),
                             strides=(2,2),
                             border_mode='same')(input_layer)
        x = Lambda(zeropad, output_shape=zeropad_output_shape)(x)
    else:
        # Options B, C in ResNet paper... 

答案 1 :(得分:0)

这对我有用,即使在懒惰(非急切)评估模式下,并且不需要需要访问具有正确填充的另一个张量(例如使用 {{ 1}})。 zeros_like 是所需的通道数,D 是我们要填充的张量。

nn

答案 2 :(得分:-1)

如果您仍在我的GitHub存储库中寻找它,请实施它。请看一下https://github.com/nellopai/deepLearningModels。 我在网上找到的所有解决方案都没有真正起作用,并且与ResNet论文不一致。在仓库中,您可以在code / networks / resNet50中找到更多详细信息。正确的实现方法是:

  def pad_depth(x, desired_channels):
        new_channels = desired_channels - x.shape.as_list()[-1]
        output = tf.identity(x)
        repetitions = new_channels/x.shape.as_list()[-1]
        for _ in range(int(repetitions)):
            zeroTensors = tf.zeros_like(x, name='pad_depth1')
            output = tf.keras.backend.concatenate([output, zeroTensors])
        return output