我想在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)
有没有人知道如何实现这样的图层?
非常感谢
答案 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