Zero-estofo para conexões de atalho ResNet quando o número do canal aumento

votos
0

Gostaria de implementar a rede ResNet em Keras com as conexões de atalho que adicionam zero entradas quando funcionalidades / canais de dimensões incompatibilidade de acordo com o artigo original:

Quando as dimensões aumentar (. Atalhos linha pontilhada na figura 3), consideramos duas opções: (A) O atalho ainda realiza mapeamento de identidade, com entradas extras de zero acolchoado para aumentar as dimensões ... http://arxiv.org/pdf/ 1512.03385v1.pdf

No entanto não foi capaz de implementá-lo e eu não consigo encontrar uma resposta na web ou no código fonte. Todas as implementações que eu encontrei usar o truque 1x1 convolução para conexões de atalho quando as dimensões incompatibilidade.

A camada gostaria de implementar seria basicamente concatenar o tensor de entrada com um tensor com um tensor de todos os zeros para compensar o desfasamento dimensão.

A idéia seria algo como isso, mas eu não poderia fazê-lo funcionar:

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

Alguém tem uma idéia de como implementar tal camada?

Muito obrigado

Publicado 04/05/2016 em 13:45
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

A pergunta foi respondida no github: https://github.com/fchollet/keras/issues/2608

Seria algo como isto:

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... 
Respondeu 09/05/2016 em 11:09
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more