2017-09-25 18 views
1

J'ai créé un initialiseur personnalisé avec Keras. Une partie du code est:Erreur lors de la création de l'initialiseur personnalisé en utilisant get_variable avec Keras

def my_init(shape): 
    P = tf.get_variable("P", shape=shape, initializer = tf.contrib.layers.xavier_initializer()) 
    return P 

model = Sequential() 
model.add(Conv2D(32, kernel_size=(5, 5),strides=(1, 1), padding='same', input_shape = input_shape, kernel_initializer = my_init)) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Conv2D(32, kernel_size=(1, 1) , strides=(1, 1) , padding='same' , kernel_initializer = my_init)) 

Quand « my_init » initialiseur est appelé pour la deuxième fois dans la couche de convolution il jette cette erreur:

Variable P already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at: 

Il ne permet pas de réutiliser la variable P. Est-il possible de créer une nouvelle variable dans chaque appel?

+0

Vous pouvez essayer 'K.variable (....)'. Il ne nécessite pas de nom. --- 'importe keras.backend comme K'. –

+0

J'ai besoin d'utiliser l'initialiseur "xavier" disponible dans tensorflow (tf.contrib.layers.xavier_initializer()) mais k.variable ne permet pas d'appeler l'initialiseur xavier. – Darshi

Répondre

1

Vous pouvez essayer d'utiliser les initialiseurs Xavier disponibles dans Keras, sous les noms glorot_uniform et glorot_normal.

les voir ici: https://keras.io/initializers/

model.add(Conv2D(32, kernel_size=(1, 1) , strides=(1, 1) , 
      padding='same' , kernel_initializer =keras.initializers.glorot_uniform())