UPDATE: TensorFlow 0.9は、「修正」このすべてをいますが、True
からVariableScopereuse
とのセットを使用している場合にのみ、という新しい方法を持っています。あなたが初期化されることを期待する変数を指定する機能を通じてsess.run(tf.initialize_variables(list(tf.get_variable(name) for name in sess.run(tf.report_uninitialized_variables(tf.all_variables())))))
またはよりインテリジェントに1行で使用することができtf.report_uninitialized_variables:
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
これはまだ実際に変数があるとされている知っているよりも少ない理想的です初期化されず、適切に処理されますが、optim
クラス(後述)のような誤った指示の場合、回避するのは難しいかもしれません。
また、tf.initialize_variablesはtf.report_uninitialized_variablesを評価できないため、両方ともセッションのコンテキスト内で動作する必要があります。
これを行うには、洗練されていませんが簡潔な方法があります。あなたの新しい変数を導入する前に、temp = set(tf.all_variables())
を実行してから、sess.run(tf.initialize_variables(set(tf.all_variables()) - temp))
を実行してください。これらは一緒になって、一時値が割り当てられた後に作成された変数のみを初期化します。
私はトランスファーラーニングで遊んでいたので、すばやくそれをやりたかったのですが、これが私が見つける最良の方法です。特に、AdamOptimizerのようなものを使用している場合、使用する変数へのアクセスが容易ではありません(またはわかりません)。だから実際に私のコードに次のように現れます。 (私は明示的に新しいレイヤーの変数を初期化し、転移学習前の初期のエラーを表示するには、一度それを実行します。ただ、健全性チェックのために。)
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))
をそして、それはすべて私の問題を解決します。
編集:@Lifu_Huang's answerは、私の問題を解決する適切な方法を述べています。理論的には、tf.train.Optimizer.get_slot_namesと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()])
これは、しかし、私AttributeError: 'NoneType' object has no attribute 'initializer'
できます。私が間違っていたことを理解したときに編集を行いますので、間違いをしないでください。
ここあなたが望むものを正確に行う[シンプルな関数](http://stackoverflow.com/a/43601894/1090562)の例です。 –
'tf.train.Optimizer.minimize(loss)'関数は[ドキュメントに記載されています](https://www.tensorflow.org/versions/r0.11/api_docs/python/train.html#Optimizer .minimize) 'optim.apply_gradients(optim.compute_gradients(損失))'。これはあなたのすべての 'None'を投げることを除いてあなたの例を私のものと同じにします。その後、 'train_step'を実行できますか?私が走った時、すべてのスロットは 'None'だったので、オプティマイザは初期化されず、ニューラルネットワークは動かなかった。 – Poik