2016-01-04 5 views
12

最近、私はTensorFlowの使用方法を習得しようとしていましたが、可変スコープがどのように正確に機能するかはわかりません。テンソルフローの可変スコープの名前について

import tensorflow as tf 
from tensorflow.models.rnn import rnn_cell 
from tensorflow.models.rnn import rnn 

inputs = [tf.placeholder(tf.float32,shape=[10,10]) for _ in range(5)] 
cell = rnn_cell.BasicLSTMCell(10) 
outpts, states = rnn.rnn(cell, inputs, dtype=tf.float32) 

print outpts[2].name 
# ==> u'RNN/BasicLSTMCell_2/mul_2:0' 

'BasicLSTMCell_2''_2'から来るん:特に、私は次のような問題がありますか?後で同じ変数を再度取得するのに、後でtf.get_variable(reuse=True)を使用するとどのように機能しますか?

編集:私は、関連する問題を見つけると思う:

def creating(s): 
    with tf.variable_scope('test'): 
     with tf.variable_scope('inner'): 
      a=tf.get_variable(s,[1]) 
    return a 

def creating_mod(s): 
    with tf.variable_scope('test'): 
     with tf.variable_scope('inner'): 
      a=tf.Variable(0.0, name=s) 
    return a 

tf.ops.reset_default_graph() 
a=creating('a') 
b=creating_mod('b') 
c=creating('c') 
d=creating_mod('d') 

print a.name, '\n', b.name,'\n', c.name,'\n', d.name 

出力は、私は混乱している

test/inner/a:0 
test_1/inner/b:0 
test/inner/c:0 
test_3/inner/d:0 

です... "BasicLSTMCell_2"

答えて

7

"_2"が関連name scopeにはoutpts[2]というオペレーションが作成されています。新しい名前スコープ(tf.name_scope())または可変スコープ(tf.variable_scope())を作成するたびに、指定された文字列に基づいて現在の名前スコープに一意の接尾辞が追加されます。 rnn.rnn(...)への呼び出しは次の擬似コード(簡素化および明確にするためのパブリックAPIメソッドを使用して)を持つ:

outputs = [] 
with tf.variable_scope("RNN"): 
    for timestep, input_t in enumerate(inputs): 
    if timestep > 0: 
     tf.get_variable_scope().reuse_variables() 
    with tf.variable_scope("BasicLSTMCell"): 
     outputs.append(...) 
return outputs 

あなたはoutptsでテンソルの名前を見れば、あなたは彼らが従っていることがわかります。

>>> print [o.name for o in outpts] 
[u'RNN/BasicLSTMCell/mul_2:0', 
u'RNN/BasicLSTMCell_1/mul_2:0', 
u'RNN/BasicLSTMCell_2/mul_2:0', 
u'RNN/BasicLSTMCell_3/mul_2:0', 
u'RNN/BasicLSTMCell_4/mul_2:0'] 

あなたは(with tf.name_scope("..."):またはwith tf.variable_scope("..."):ブロックを入力して)新しい名前の範囲を入力すると、TensorFlowはスコープのための新しい、ユニークな名を作成します。最初に"BasicLSTMCell"スコープが入力されると、TensorFlowはこれまで使用されていなかったため("RNN/"スコープ内にある)、その名前をそのまま使用します。次回、TensorFlowは"_1"をスコープに追加してユニークにします(最大で"RNN/BasicLSTMCell_4")。

可変スコープとネームスコープの主な違いは、可変スコープも一連の名前からtf.Variableのバインディングを持つことです。 tf.get_variable_scope().reuse_variables()を呼び出すことで、"RNN/"スコープ(およびその子)の変数をtimestep0の後で作成するのではなく、の再利用にTensorFlowに指示します。これにより、複数のRNNセル間で重みが正しく共有されます。

+0

tf.name_scopeが使用されているコードの正確な行を指摘できますか? rnn_cell.pyの# "BasicLSTMCell" ' – Xiaotong

+0

トップレベル(' 'RNN' ')のスコープ(' 'RNN' ')は2つあります。リンク](https://github.com/tensorflow/tensorflow/blob/97522f0acd53652baa57e42d06557ebb94bf0c4d/tensorflow/python/ops/rnn.py#L86))、ネストされた( "" BasicLSTMCell ")スコープ([link](https ://github.com/tensorflow/tensorflow/blob/97522f0acd53652baa57e42d06557ebb94bf0c4d/tensorflow/python/ops/rnn_cell.py#L187))。 'variable_scope()'の呼び出しは、 'name_scope()'の呼び出しを意味することに注意してください(実装[here](https://github.com/tensorflow/tensorflow/blob/97522f0acd53652baa57e42d06557ebb94bf0c4d/tensorflow/python/ops/variable_scopeを参照)。 py#L381))。 – mrry

+0

私は 'variable_scope()'がどこで使われているのかを明確にするために答えを編集しました。 – mrry

6

上記の回答は間違っています。

2つの異なる機能が定義されているように見えますが、なぜ2つの異なるスコープ名があるのか​​を教えてください。creatingcreating_mod

これは、tf.Variable(0.0, name=s)を使用して、creating_modという変数に変数を作成したためです。

変数をスコープで認識させる場合は、常にtf.get_variableを使用してください。

詳しくはissueをご覧ください。

ありがとうございます!

+0

私もこの問題に遭遇しました。しかし、いつもtf.get_variableを使っていても、私は変数スコープに "_1"を追加しています – mhz

関連する問題