TensorFlowグラフを複製して最新の状態に保つ最良の方法は何ですか?テンソルフローグラフを複製する
理想的には、複製されたグラフを別のデバイス(GPUからCPUなど)に配置し、そのコピーを随時更新したいと考えています。
TensorFlowグラフを複製して最新の状態に保つ最良の方法は何ですか?テンソルフローグラフを複製する
理想的には、複製されたグラフを別のデバイス(GPUからCPUなど)に配置し、そのコピーを随時更新したいと考えています。
短い回答:おそらくcheckpoint files(permalink)が必要です。
長い答え:
のは、ここにセットアップについて明確にしてみましょう。私はあなたが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)。正確にはと同じ回答が必要な場合は注意してください。しかし、これは複数のデバイスで動作することについての難しい事実です。
幸運を祈る!
私は一般的なアプローチはOPが記述されているものであるかどうかを確認するために、かなり単純化の答えで行くしようとするでしょう:
私はtf.train.Saverオブジェクトを介して実装すると思います。
saver.save(session_var, 'model1', global_step=step)
そしてロードインスタンス内:
は、すべてのn回の反復、あなたが追加することができますが、変数W1、W2であなたの重みを持っていると仮定し、列車のループのB1mysaver = tf.train.Saver(({'w1': W1, 'w2': W2, 'b1': b1}))
tf.train.Saver.restore(other_session_object, 'model1')
希望する解決策に似ています。
既存のグラフを複製するのではなく、複数のグラフを並列に構築してみませんか? –
この質問はかなり曖昧です。 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
@rdadolf第2のもの。私はちょうど別のマシン上に同じモデルのコピーを保持し、パラメータを時々同期させる必要があります。 – MBZ