Je voulais initialiser une partie de la variable sur mon réseau avec des valeurs numpy. Pour l'exemple, considérons:
init=np.random.Rand(1,2)
tf.get_variable('var_name',initializer=init)
quand je fais ça je reçois une erreur:
ValueError: Shape of a new variable (var_name) must be fully defined, but instead was <unknown>.
pourquoi est-ce que je reçois cette erreur?
Pour essayer de le réparer, j'ai essayé de faire:
tf.get_variable('var_name',initializer=init, shape=[1,2])
qui a donné une erreur encore plus étrange:
TypeError: 'numpy.ndarray' object is not callable
J'ai essayé de lire la documentation et les exemples mais cela n'a pas vraiment aidé.
N'est-il pas possible d'initialiser des variables avec des tableaux numpy avec la méthode get_variable dans TensorFlow?
Les oeuvres suivantes:
init = tf.constant(np.random.Rand(1, 2))
tf.get_variable('var_name', initializer=init)
La documentation de get_variable
manque un peu en effet. Juste pour votre information, l’argument initializer
doit être soit un objet TensorFlow Tensor
(qui peut être construit en appelant tf.constant
sur une valeur numpy
dans votre cas) ou un "appelable" qui prend deux arguments, shape
et dtype
, la forme et le type de données de la valeur censé revenir. Là encore, dans votre cas, vous pouvez écrire ce qui suit si vous souhaitez utiliser le mécanisme "appelable":
init = lambda shape, dtype: np.random.Rand(*shape)
tf.tf.get_variable('var_name', initializer=init, shape=[1, 2])
@keveman a bien répondu, et pour complément, il y a l'utilisation de tf.get_variable ('nom_var', initializer = init) , le document tensorflow a donné un exemple complet.
import numpy as np
import tensorflow as tf
value = [0, 1, 2, 3, 4, 5, 6, 7]
# value = np.array(value)
# value = value.reshape([2, 4])
init = tf.constant_initializer(value)
print('fitting shape:')
tf.reset_default_graph()
with tf.Session() :
x = tf.get_variable('x', shape = [2, 4], initializer = init)
x.initializer.run()
print(x.eval())
fitting shape :
[[0. 1. 2. 3.]
[4. 5. 6. 7.]]
print('larger shape:')
tf.reset_default_graph()
with tf.Session() :
x = tf.get_variable('x', shape = [3, 4], initializer = init)
x.initializer.run()
print(x.eval())
larger shape :
[[0. 1. 2. 3.]
[4. 5. 6. 7.]
[7. 7. 7. 7.]]
print('smaller shape:')
tf.reset_default_graph()
with tf.Session() :
x = tf.get_variable('x', shape = [2, 3], initializer = init)
* <b>`ValueError`< / b > : Too many elements provided.Needed at most 6, but received 8
https://www.tensorflow.org/api_docs/python/tf/constant_initializer
Si la variable a déjà été créée (à partir d'une fonction complexe), utilisez simplement load
.
https://www.tensorflow.org/api_docs/python/tf/Variable#load
x_var = tf.Variable(tf.zeros((1, 2), tf.float32))
x_val = np.random.Rand(1,2).astype(np.float32)
sess = tf.Session()
x_var.load(x_val, session=sess)
# test
assert np.all(sess.run(x_var) == x_val)