2016-10-27 7 views
6

私はPythonでTensorFlowを使い始め、単純なフィードフォワードNNを構築しようとしています。私はネットワークの重み(列車の間に更新され、実行時間のために一定のままである変数)とネットワークを訓練するための別のスクリプトを持っています。訓練データを取得し、それらをバッチに分け、ネットワークをバッチで訓練します。 私はネットワークを訓練しようとすると、私はデータテンソルはNNテンソルと同じグラフにないことを示すエラーが表示されます。TensorFlow:テンソルが同じグラフ内にあることを確認する方法

ValueError: Tensor("Placeholder:0", shape=(10, 5), dtype=float32) must be from the same graph as Tensor("windows/embedding/Cast:0", shape=(100232, 50), dtype=float32).

トレーニングスクリプト内の関連する部分は、以下のとおりです。

def placeholder_inputs(batch_size, ner): 
    windows_placeholder = tf.placeholder(tf.float32, shape=(batch_size, ner.windowsize)) 
    labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size)) 
    return windows_placeholder, labels_placeholder 

with tf.Session() as sess: 
    windows_placeholder, labels_placeholder = placeholder_inputs(batch_size, ner) 
    logits = ner.inference(windows_placeholder) 

やネットワーククラスの関連は、次のとおりです。

class WindowNER(object): 
def __init__(self, wv, windowsize=3, dims=[None, 100,5], reg=0.01): 
    self.reg=reg 
    self.windowsize=windowsize 
    self.vocab_size = wv.shape[0] 
    self.embedding_dim = wv.shape[1] 
    with tf.name_scope("embedding"): 
     self.L = tf.cast(tf.Variable(wv, trainable=True, name="L"), tf.float32) 
    with tf.name_scope('hidden1'): 
     self.W = tf.Variable(tf.truncated_normal([windowsize * self.embedding_dim, dims[1]], 
      stddev=1.0/math.sqrt(float(windowsize*self.embedding_dim))), 
     name='weights') 
     self.b1 = tf.Variable(tf.zeros([dims[1]]), name='biases') 
    with tf.name_scope('output'): 
     self.U = tf.Variable(tf.truncated_normal([dims[1], dims[2]], stddev = 1.0/math.sqrt(float(dims[1]))), name='weights') 
     self.b2 = tf.Variable(tf.zeros(dims[2], name='biases')) 


def inference(self, windows): 
    with tf.name_scope("embedding"): 
     embedded_words = tf.reshape(tf.nn.embedding_lookup(self.L, windows), [windows.get_shape()[0], self.windowsize * self.embedding_dim]) 
    with tf.name_scope("hidden1"): 
     h = tf.nn.tanh(tf.matmul(embedded_words, self.W) + self.b1) 
    with tf.name_scope('output'): 
     t = tf.matmul(h, self.U) + self.b2 

は、なぜ最初の場所で2つのグラフがあり、データプレースホルダのテンソルがNNと同じグラフ内にあることを確認するにはどうすればよいですか?

ありがとうございます!

答えて

5

あなたはこのような何かを行うことによって、同じグラフの下にあるすべてのテンソルを作成することができるはずです。

g = tf.Graph() 
with g.as_default(): 
    windows_placeholder, labels_placeholder = placeholder_inputs(batch_size, ner) 
    logits = ner.inference(windows_placeholder) 

with tf.Session(graph=g) as sess: 
    # Run a session etc 

あなたがここにTFのグラフについての詳細を読むことができます: https://www.tensorflow.org/versions/r0.8/api_docs/python/framework.html#Graph

+0

ありがとうございました!しかし、私はこの変更を行いました(セッションをコメントアウトしてグラフが正しく構築されるまで)。そして、私はまだ同じエラーが出ます - 「Tensor(...)はTensor(...)と同じグラフでなければなりません。 – user616254

+0

完全なコードを見ることができなければ、言うことは難しいです。しかし、 'g.as_default()'スコープの外側で演算子を構築しているコードがあるか、呼び出しているコードの一部が独自のグラフを構築している可能性があります。もっとコードを表示できますか? (正直言って、私が試すつもりなのは、演算子を構成し、各演算子が追加されているグラフのIDを表示するTensorflow Pythonコードをインストルメントすることです)。 –

0

を時々あなたが得るときこのようなエラーは、エラー(別のグラフの間違った変数を使うことが多い)がずっと早く起きてしまい、最終的にエラーを投げた操作に伝播する可能性があります。したがって、その線のみを調べ、テンソルが同じグラフから得られるべきであると結論づけることができますが、誤差は実際には他のどこかにあります。

グラフを確認する最も簡単な方法は、グラフ内の各変数/ opにどのグラフを使用するかを印刷することです。次の方法で簡単に設定できます。

print(variable_name.graph) 
関連する問題