web-dev-qa-db-fra.com

Initialisation du poids personnalisé tensorflow tf.layers.dense

J'essaie de configurer un initialiseur personnalisé sur tf.layers.dense où j'initialise kernel_initializer avec une matrice de poids que j'ai déjà.

u_1 = tf.placeholder(tf.float32, [784, 784])
first_layer_u = tf.layers.dense(X_, n_params, activation=None, 
                              kernel_initializer=u_1,
                              bias_initializer=tf.keras.initializers.he_normal())

Ceci génère une erreur disant ValueError: If initializer is a constant, do not specify shape.

Est-ce un problème d'attribuer un espace réservé à kernel_initializer ou est-ce que je manque quelque chose?

7
naveen marri

Il existe au moins deux façons d'y parvenir:

1 Créez votre propre calque

  W1 = tf.Variable(YOUR_WEIGHT_MATRIX, name='Weights')
  b1 = tf.Variable(tf.zeros([YOUR_LAYER_SIZE]), name='Biases') #or pass your own
  h1 = tf.add(tf.matmul(X, W1), b1)

2 Utilisez le tf.constant_initializer

init = tf.constant_initializer(YOUR_WEIGHT_MATRIX)
l1 = tf.layers.dense(X, o, kernel_initializer=init)
7
Jonathan R

Je pense que vous pouvez définir votre propre fonction d'initialisation. La fonction doit prendre 3 arguments: shape, dtype et partition_info. Il doit retourner un tf.Tensor Qui sera utilisé pour initialiser le poids. Puisque vous avez un tableau numpy, je pense que vous pouvez utiliser tf.constant Pour créer ce tenseur. Par exemple:

def custom_initializer(shape_list, dtype, partition_info):
    # Use np.ones((7, 3)) as an example
    return tf.constant(np.ones((7, 3)))

Ensuite, vous pouvez le transmettre à kernel_initializer. Cela devrait fonctionner si toutes les dimensions correspondent. Je mets un exemple sur Gist en utilisant Estimator pour construire le modèle et en utilisant LoggingTensorHook pour enregistrer dense/kernel À chaque étape. Vous devriez pouvoir voir que le poids est initié correctement.

Éditer:

Je viens de découvrir que l'utilisation de tf.constant_initializer Sera meilleure. Il est utilisé dans tensorflow guide . Vous pouvez faire kernel_initializer=tf.constant_initializer(np.ones((7, 3))).

6
Y. Luo