UPDATE: TensorFlow 0.9 ma nową metodę, która „naprawia” to wszystko ale tylko jeśli używasz VariableScope z reuse
zestaw do True
. tf.report_uninitialized_variables które mogą być wykorzystane w jednej linii z sess.run(tf.initialize_variables(list(tf.get_variable(name) for name in sess.run(tf.report_uninitialized_variables(tf.all_variables())))))
lub bardziej inteligentnie poprzez zdolność do określenia zmiennych można oczekiwać, aby być inicjowane:
def guarantee_initialized_variables(session, list_of_variables = None):
if list_of_variables is None:
list_of_variables = tf.all_variables()
uninitialized_variables = list(tf.get_variable(name) for name in
session.run(tf.report_uninitialized_variables(list_of_variables)))
session.run(tf.initialize_variables(uninitialized_variables))
return unintialized_variables
To wciąż mniej doskonały niż faktycznie wiedząc, które zmienne są i są nie zainicjalizowany i nie zajmujący się tym prawidłowo, ale w przypadku błędnego kierunku, jak klasy optim
(patrz poniżej) może być trudno uniknąć.
Należy również zauważyć, że tf.initialize_variables nie można ocenić tf.report_uninitialized_variables, więc oba z nich muszą być uruchamiane w kontekście sesji do pracy.
Jest nieeleganckie, ale zwięzły sposób to zrobić. Przed wprowadzeniem nowych zmiennych uruchom temp = set(tf.all_variables())
, a następnie uruchom sess.run(tf.initialize_variables(set(tf.all_variables()) - temp))
. Te razem inicjują tylko zmienne utworzone po przypisaniu wartości temperatury.
Grałem z uczeniem transferu, więc chciałem zrobić to szybko, ale jest to najlepszy sposób, jaki mogłem znaleźć. Zwłaszcza gdy używa się rzeczy takich jak AdamOptimizer, co nie daje łatwego (lub innego, nie jestem pewien) dostępu do zmiennych, których używa. Tak więc poniższe pojawia się w moim kodzie. (I inicjowanie zmiennych nowej warstwy za jawnie, i uruchomić go raz, aby pokazać początkowy błąd przed nauką transferowego. Tylko dla sprawdzenia dokonywane.)
temp = set(tf.all_variables())
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
#I honestly don't know how else to initialize ADAM in TensorFlow.
sess.run(tf.initialize_variables(set(tf.all_variables()) - temp))
I to rozwiązuje wszystkie moje problemy.
EDYTOWANIE:@Lifu_Huang's answer określa właściwy sposób rozwiązania mojego problemu. Teoretycznie, należy użyć tf.train.Optimizer.get_slot_names i tf.train.Optimizer.get_slot:
optim = tf.train.AdadeltaOptimizer(1e-4)
loss = cross_entropy(y,yhat)
train_step = optim.minimize(loss)
sess.run(tf.initialize_variables([optim.get_slot(loss, name)
for name in optim.get_slot_names()])
To jednak daje mi AttributeError: 'NoneType' object has no attribute 'initializer'
. Wprowadzę zmiany, gdy zorientuję się, co zrobiłem źle, więc nie popełniasz moich błędów.
Tutaj jest przykładem [prostej funkcji] (http://stackoverflow.com/a/43601894/1090562), która robi dokładnie to, co chcesz. –
Funkcja 'tf.train.Optimizer.minimize (loss)' jest [zdefiniowana jako w dokumentacji] (https://www.tensorflow.org/versions/r0.11/api_docs/python/train.html#Optimizer .minimize) 'optim.apply_gradients (optim.compute_gradients (loss))'.To sprawi, że twój przykład będzie taki sam jak mój, z wyjątkiem tego, że wyrzucisz wszystkie "Brak". Czy po tym możesz uruchomić 'train_step'? Kiedy go uruchomiłem, wszystkie gniazda były "Brak", więc optymalizator pozostał niezainicjowany i sieć neuronowa nie działała. – Poik