复制TensorFlow图并保持上升状态的最佳方法是什么?
理想情况下,我想将复制的图形放在另一台设备上(例如从GPU到CPU),然后不时更新副本。
答案 0 :(得分:10)
简答:您可能需要checkpoint files(permalink)。
答案很长:
让我们清楚这里的设置。我假设你有两个设备,A和B,你正在训练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]
如果您启动培训计划,然后启动推理程序,您将看到推理程序产生两个不同的输出(来自相同的输入批处理)。这是因为它获取了训练计划检查点的参数。
现在,这个程序显然不是你的终点。我们不做任何真正的同步,你必须决定“周期性”对于检查点的含义。但是,这应该让您了解如何将参数从一个网络同步到另一个网络。
最后一个警告:不意味着两个网络必然是确定性的。 TensorFlow中有已知的非确定性元素(例如this),因此如果您需要完全相同的答案,请小心谨慎。但这是关于在多个设备上运行的硬道理。
祝你好运!答案 1 :(得分:2)
我会尝试使用一个非常简单的答案,看看一般的方法是OP所描述的:
我将通过tf.train.Saver对象实现它。
假设你的权重在变量W1,W2和b1
中mysaver = tf.train.Saver(({'w1': W1, 'w2': W2, 'b1': b1}))
在火车循环中,您可以每n次迭代添加:
saver.save(session_var, 'model1', global_step=step)
然后在加载实例中,需要时运行:
tf.train.Saver.restore(other_session_object, 'model1')
希望这与您提出的解决方案类似。
答案 2 :(得分:0)
只需进行往返tf.Graph
> tf.GraphDef
> tf.Graph
:
import tensorflow as tf
def copy_graph(graph: tf.Graph) -> tf.Graph:
with tf.Graph().as_default() as copied_graph:
graph_def = graph.as_graph_def(add_shapes=True)
tf.graph_util.import_graph_def(graph_def)
return copied_graph