ネットワーク上の変数の一部を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
ドキュメントと例 を読んでみましたが、実際には役に立ちませんでした。
TensorFlowのget_variableメソッドでnumpy配列で変数を初期化することはできませんか?
以下の作品:
init = tf.constant(np.random.Rand(1, 2))
tf.get_variable('var_name', initializer=init)
get_variable
のドキュメントは確かに少し欠けています。参照用に、initializer
引数はTensorFlow Tensor
オブジェクト(numpy
値に対してtf.constant
を呼び出すことで構築できます)、またはshape
とdtype
の2つの引数をとる「呼び出し可能」。返される値の形状とデータ型。繰り返しになりますが、「呼び出し可能」メカニズムを使用したい場合は、次のように記述できます。
init = lambda shape, dtype: np.random.Rand(*shape)
tf.tf.get_variable('var_name', initializer=init, shape=[1, 2])
@kevemanよく回答し、補足として、tf.get_variable( 'var_name'、initializer = init)の使用法があります。包括的な例。
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
変数が既に作成されている場合(つまり、何らかの複雑な関数から)、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)