2016-07-04 13 views
16

Chciałem zainicjować niektóre zmienne w mojej sieci z numpy wartościami. Przez wzgląd na przykład rozważyć:Jak zainicjować zmienną z tf.get_variable i numpy w TensorFlow?

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

gdy to zrobić pojawia się błąd:

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

dlaczego jest tak, że ja dostaję ten błąd?

Aby spróbować go naprawić Próbowałem robić:

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

które przyniosły jeszcze dziwniejsze błąd:

TypeError: 'numpy.ndarray' object is not callable 

próbowałem czytać the docs and examples ale to naprawdę nie pomaga.

Czy nie można zainicjować zmiennych za pomocą numpy array przy pomocy metody get_variable w TensorFlow?

Odpowiedz

25

następujące utwory:

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

Dokumentacja get_variable jest trochę brakuje rzeczywiście. Dla własnego odniesienia argument initializer musi być obiektem TensorFlow Tensor (który można skonstruować, wywołując w jego przypadku wartość tf.constant dla wartości numpy) lub "wywoływalny", który przyjmuje dwa argumenty: kształt i typ danych wartości, która ma powrócić. Ponownie, w danym przypadku, można napisać następujące w razie gdybyś chciał używać „wpłacone” mechanizm:

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

[To] (http://stackoverflow.com/questions/111234/what-is-a-callable-in-python) jest doskonałym odpowiedź na swoje pytanie. – keveman

+0

'Wywoływane' jest funkcją lub czymś, co można nazwać funkcją. – hpaulj

+0

'tf.get_variable ('nazwa_zmiennej', inicjator = np.random.rand (1, 2)) wydaje się działać teraz na r0.10. – ldavid

6

@keveman odpowiedział dobrze, a na dodatek, jest wykorzystanie tf.get_variable (” nazwa_zmiennej ", initializer = init), dokument tensorflow dał wyczerpujący przykład.

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

2

Jeśli zmienna została już utworzona (tzn od jakiegoś funkcji zespolonej), wystarczy użyć 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) 
Powiązane problemy