Как инициализировать переменную с tf.get_variable и значением numpy в TensorFlow?

Я хотел инициализировать некоторую переменную в моей сети с помощью значений numpy. Для примера рассмотрим:

init=np.random.rand(1,2)
tf.get_variable('var_name',initializer=init)

когда я делаю это, я получаю сообщение об ошибке:

ValueError: Shape of a new variable (var_name) must be fully defined, but instead was <unknown>.

почему я получаю эту ошибку?

Чтобы попытаться исправить это, я попытался сделать:

tf.get_variable('var_name',initializer=init, shape=[1,2])

что дало еще более странную ошибку:

TypeError: 'numpy.ndarray' object is not callable

Я пробовал читать документы и примеры, но это не помогло.

Невозможно ли инициализировать переменные с массивами numpy с помощью метода get_variable в TensorFlow?

Ответ 1

Следующие работы:

init = tf.constant(np.random.rand(1, 2))
tf.get_variable('var_name', initializer=init)

Документация для get_variable немного отсутствует. Для вашей справки аргумент initializer должен быть либо объектом TensorFlow Tensor (который может быть создан путем вызова tf.constant по значению numpy в вашем случае), либо "вызываемого", который принимает два аргумента, shape и dtype, тип формы и данных значения, которое он должен был вернуть. Опять же, в вашем случае вы можете написать следующее, если вы хотите использовать механизм "вызываемого":

init = lambda shape, dtype: np.random.rand(*shape)
tf.tf.get_variable('var_name', initializer=init, shape=[1, 2])

Ответ 2

@keveman Хорошо ответили, и для дополнения есть использование tf.get_variable ('var_name', initializer = init), документ tensorflow действительно дал исчерпывающий пример.

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

Ответ 3

Если переменная уже была создана (т.е. из некоторой сложной функции), просто используйте 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)