2017-06-24 12 views
0

私は徐々にいくつかの条件に基づいてtf.Graphを構築し、追加を終えた後に1回実行しようとしています。次のようにあるよう徐々にtf.Graphをビルドして実行します

コードが見えます:メソッドを呼び出す

class Model: 
    def __init__(self): 
     self.graph = tf.Graph() 
     ... some code ... 

    def build_initial_graph(self): 
     with self.graph.as_default(): 
      X = tf.placeholder(tf.float32, shape=some_shape) 
      ... some code ... 

    def add_to_existing_graph(self): 
     with self.graph.as_default(): 
      ... some code adding more ops to the graph ... 

    def transform(self, data): 
     with tf.Session(graph=self.graph) as session: 
      y = session.run(Y, feed_dict={X: data}) 
     return y 

は、だから、二つの質問

  1. をこの

    model = Model() 
    model.build_initial_graph() 
    model.add_to_existing_graph() 
    model.add_to_existing_graph() 
    result = model.transform(data) 
    

    のようになります。追加の合法的なこの方法です既存のグラフへの操作?別の場所で同じグラフオブジェクトを使用するか、古いものを上書きしますか?

  2. コードが実行されたときに変換方法でがfeed_dictに認識されない場合、それを達成する正しい方法は何ですか?

答えて

1

1:これはもちろんモデルを構築するための正当な方法ですが、それはより重要な意見です。私は属性としてテンソルを格納することを提案します(Q2への回答を参照)。self.X=...

このvery nice postには、TensorFlowモデルをオブジェクト指向の方法で構造化する方法があります。

Q2:理由は本当に簡単で、変数Xtransformメソッドの範囲外です。
次のすべてが正常に動作します行う場合:

def build_initial_graph(self): 
    with self.graph.as_default(): 
     self.X = tf.placeholder(tf.float32, shape=some_shape) 
     ... some code ... 

def transform(self, data): 
    with tf.Session(graph=self.graph) as session: 
     return session.run(self.Y, feed_dict={self.X: data}) 

をより詳細にするために、TensorFlowに、あなたが(例えばtf.placeholderまたはtf.matmul)を定義するすべてのテンソルや操作がtf.Graph()あなたre working on. You might want to store them in Python variable, as you did by doing X = TFで定義されています.placeholder`しかしそれは必須ではありません。

あなたはどちらか

  • Pythonの変数を使用することができますが、定義されたテンソルの1にした後にアクセスしたい場合は(それが変数Xがの範囲ではなかったことを除いて、あなたの試みだったがメソッド)または
  • tf.get_variableメソッドを使用してグラフから直接取得します(名前を知っておく必要があります)。
関連する問題