web-dev-qa-db-fra.com

Comment initialise-t-on une variable avec tf.get_variable et une valeur numpy dans TensorFlow?

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?

22
Pinocchio

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])
37
keveman

@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

10
Nezha

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)
4
James D