2016-05-04 2 views
0

je voudrais mettre en œuvre le réseau ResNet dans Keras avec les connexions de raccourci qui ajoutent zéro entrées lorsque les caractéristiques/canaux dimensions inadéquation selon l'article original:zéro rembourrage pour les connexions de raccourci ResNet quand augmenter le nombre de canaux

lorsque les dimensions augmentent (. raccourcis pointillés sur la figure 3), nous considérons deux options: (A) Le raccourci effectue encore la cartographie identité , avec zéro supplémentaires entrées rembourrées pour des dimensions de plus en plus ... http://arxiv.org/pdf/1512.03385v1.pdf

Cependant n'a pas pu l'implémenter et je n'arrive pas à trouver une réponse sur le web ou sur le code source. Toutes les implémentations que j'ai trouvées utilisent l'astuce de convolution 1x1 pour les connexions de raccourcis lorsque les dimensions ne correspondent pas.

La couche que je voudrais implémenter concaténerait fondamentalement le tenseur d'entrée avec un tenseur avec un tenseur tout zéros pour compenser le désaccord de dimension.

L'idée serait quelque chose comme ça, mais je ne pouvais pas le faire fonctionner:

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

Est-ce que quelqu'un a une idée sur la façon de mettre en œuvre une telle couche?

Merci beaucoup

Répondre

1

La question a été répondue sur github: https://github.com/fchollet/keras/issues/2608

Ce serait quelque chose comme ceci:

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...