2016-06-14 6 views
6

TensorFlowグラフを複製して最新の状態に保つ最良の方法は何ですか?テンソルフローグラフを複製する

理想的には、複製されたグラフを別のデバイス(GPUからCPUなど)に配置し、そのコピーを随時更新したいと考えています。

+0

既存のグラフを複製するのではなく、複数のグラフを並列に構築してみませんか? –

+1

この質問はかなり曖昧です。 TensorFlowの 'Graph'データ構造を現場で更新することを求めていますか?(ハード)(http://stackoverflow.com/questions/37610757/how-to-remove-nodes-from-tensorflow-graph/37620231#37620231) ?あるいは、あるグラフのパラメータを他のグラフから更新する方法について質問しています(それほど悪くない)(https://www.tensorflow.org/versions/master/how_tos/variables/index.html#saving-and-restoring )構造を変えずに?あるいはこれはニューラルネットワーク(ソフトウェア工学の問題である)のバージョン管理に関連していますか? – rdadolf

+0

@rdadolf第2のもの。私はちょうど別のマシン上に同じモデルのコピーを保持し、パラメータを時々同期させる必要があります。 – MBZ

答えて

10

短い回答:おそらくcheckpoint filespermalink)が必要です。


長い答え:

のは、ここにセットアップについて明確にしてみましょう。私はあなたがAとBの2つのデバイスを持っていると仮定し、AとBの推論を実行していると仮定します。 定期的に、推論を実行しているデバイスのパラメータを、その他。 上記のリンク先のチュートリアルは、始めるのに適しています。 tf.train.Saverオブジェクトがどのように機能するかを示しています。ここではもっと複雑なものは必要ありません。ここで

は一例です:

import tensorflow as tf 

def build_net(graph, device): 
    with graph.as_default(): 
    with graph.device(device): 
     # Input placeholders 
     inputs = tf.placeholder(tf.float32, [None, 784]) 
     labels = tf.placeholder(tf.float32, [None, 10]) 
     # Initialization 
     w0 = tf.get_variable('w0', shape=[784,256], initializer=tf.contrib.layers.xavier_initializer()) 
     w1 = tf.get_variable('w1', shape=[256,256], initializer=tf.contrib.layers.xavier_initializer()) 
     w2 = tf.get_variable('w2', shape=[256,10], initializer=tf.contrib.layers.xavier_initializer()) 
     b0 = tf.Variable(tf.zeros([256])) 
     b1 = tf.Variable(tf.zeros([256])) 
     b2 = tf.Variable(tf.zeros([10])) 
     # Inference network 
     h1 = tf.nn.relu(tf.matmul(inputs, w0)+b0) 
     h2 = tf.nn.relu(tf.matmul(h1,w1)+b1) 
     output = tf.nn.softmax(tf.matmul(h2,w2)+b2) 
     # Training network 
     cross_entropy = tf.reduce_mean(-tf.reduce_sum(labels * tf.log(output), reduction_indices=[1])) 
     optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)  
     # Your checkpoint function 
     saver = tf.train.Saver() 
     return tf.initialize_all_variables(), inputs, labels, output, optimizer, saver 

研修プログラムのためのコード:

def programA_main(): 
    from tensorflow.examples.tutorials.mnist import input_data 
    mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 
    # Build training network on device A 
    graphA = tf.Graph() 
    init, inputs, labels, _, training_net, saver = build_net(graphA, '/cpu:0') 
    with tf.Session(graph=graphA) as sess: 
    sess.run(init) 
    for step in xrange(1,10000): 
     batch = mnist.train.next_batch(50) 
     sess.run(training_net, feed_dict={inputs: batch[0], labels: batch[1]}) 
     if step%100==0: 
     saver.save(sess, '/tmp/graph.checkpoint') 
     print 'saved checkpoint' 

...と推論プログラムのためのコード:

def programB_main(): 
    from tensorflow.examples.tutorials.mnist import input_data 
    mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 
    # Build inference network on device B 
    graphB = tf.Graph() 
    init, inputs, _, inference_net, _, saver = build_net(graphB, '/cpu:0') 
    with tf.Session(graph=graphB) as sess: 
    batch = mnist.test.next_batch(50) 

    saver.restore(sess, '/tmp/graph.checkpoint') 
    print 'loaded checkpoint' 
    out = sess.run(inference_net, feed_dict={inputs: batch[0]}) 
    print out[0] 

    import time; time.sleep(2) 

    saver.restore(sess, '/tmp/graph.checkpoint') 
    print 'loaded checkpoint' 
    out = sess.run(inference_net, feed_dict={inputs: batch[0]}) 
    print out[1] 

あなたが解雇した場合トレーニングプログラムと推論プログラムを起動すると、推論プログラムが2つの異なる出力を生成することがわかります(同じ入力バッチから)。これは、トレーニングプログラムがチェックポイントしたパラメータを取得した結果です。

今、このプログラムは明らかにあなたの終点ではありません。実際の同期は行わず、チェックポイント設定に関して「定期的な」意味を判断する必要があります。しかしこれは、あるネットワークから別のネットワークにパラメータを同期させる方法のアイデアを与えるはずです。

最終的な警告:これはではありません。では、2つのネットワークが必ず確定的であることを意味します。 TensorFlowには非確定的要素が知られています(たとえばthis)。正確にはと同じ回答が必要な場合は注意してください。しかし、これは複数のデバイスで動作することについての難しい事実です。

幸運を祈る!

2

私は一般的なアプローチはOPが記述されているものであるかどうかを確認するために、かなり単純化の答えで行くしようとするでしょう:

私はtf.train.Saverオブジェクトを介して実装すると思います。

saver.save(session_var, 'model1', global_step=step) 

そしてロードインスタンス内:

は、すべてのn回の反復、あなたが追加することができますが、変数W1、W2であなたの重みを持っていると仮定し、列車のループのB1

mysaver = tf.train.Saver(({'w1': W1, 'w2': W2, 'b1': b1})) 

tf.train.Saver.restore(other_session_object, 'model1') 

希望する解決策に似ています。