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