<p>简短回答:</p>
<ol>
<li>您需要将全局步骤传递给传递给mon的优化器_sess.运行. 这使得保存和检索保存的检查点成为可能。在</li>
<li>可以通过单个MonitoredTrainingSession同时运行培训+交叉验证会话。首先,您需要通过同一个图的不同流传递训练批和交叉验证批(我建议您查找<a href="https://www.tensorflow.org/programmers_guide/datasets" rel="nofollow noreferrer">this guide</a>以了解如何执行此操作的信息)。第二,你必须-去孟_sess.运行()—传递训练流的优化器,以及交叉验证流丢失的参数(/parameter you want track)。如果要与培训分开运行测试会话,只需在图形中运行测试集,并在图形中只运行test_loss(/other parameters you want track)。有关如何完成此操作的更多详细信息,请查看下面的内容。在</li>
</ol>
<p>长话短说:</p>
<p>我会更新我的答案,因为我自己得到了更好的看法,可以做什么列车监控会话(列车监控训练课程只是创建一个列车监控会话,如<a href="https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/python/training/monitored_session.py" rel="nofollow noreferrer">source code</a>)所示。在</p>
<p>下面是一个示例代码,演示如何每隔5秒将检查点保存到“./ckpt_dir”。中断时,它将在最后保存的检查点重新启动:</p>
<pre><code>def train(inputs, labels_onehot, global_step):
out = tf.contrib.layers.fully_connected(
inputs,
num_outputs=10,
activation_fn=tf.nn.sigmoid)
loss = tf.reduce_mean(
tf.reduce_sum(
tf.nn.sigmoid_cross_entropy_with_logits(
logits=out,
labels=labels_onehot), axis=1))
train_op = opt.minimize(loss, global_step=global_step)
return train_op
with tf.Graph().as_default():
global_step = tf.train.get_or_create_global_step()
inputs = ...
labels_onehot = ...
train_op = train(inputs, labels_onehot, global_step)
with tf.train.MonitoredTrainingSession(
checkpoint_dir='./ckpt_dir',
save_checkpoint_secs=5,
hooks=[ ... ] # Choose your hooks
) as mon_sess:
while not mon_sess.should_stop():
mon_sess.run(train_op)
</code></pre>
<p>为了实现这一目标,在监控培训课程中所发生的事情实际上是三件事:</p>
<ol>
<li>在列车监控训练课程创建一个<a href="https://www.tensorflow.org/versions/r1.3/api_docs/python/tf/train/Scaffold" rel="nofollow noreferrer">tf.train.Scaffold</a>对象,其工作方式类似于web中的spider;它收集了训练、保存和加载模型所需的部分。在</li>
<li>它创建一个<a href="https://www.tensorflow.org/api_docs/python/tf/train/ChiefSessionCreator" rel="nofollow noreferrer">tf.train.ChiefSessionCreator</a>对象。我对这一点的了解是有限的,但据我的理解,它是用于当您的tf算法在多个服务器上传播时使用的。我的看法是,它告诉运行文件的计算机它是主计算机,检查点目录应该保存在这里,日志记录者应该在这里记录他们的数据,等等</li>
<li>它创建一个<a href="https://www.tensorflow.org/api_docs/python/tf/train/CheckpointSaverHook" rel="nofollow noreferrer">tf.train.CheckpointSaverHook</a>,用于保存检查点。在</li>
</ol>
<p>为了让它发挥作用tf.train.CheckpointSaverHook以及tf.train.ChiefSessionCreator必须传递对检查点目录和scaffold的相同引用。如果列车监控训练课程由于上述示例中的参数将由上述3个组件实现,因此它看起来如下所示:</p>
^{pr2}$
<p>为了进行训练+交叉验证会话,可以使用列车监控会话。与partial一起运行\u step_fn(),后者运行会话调用而不调用任何钩子。这看起来是你训练你的模型进行<em>n</em>迭代,然后你运行你的测试集,重新初始化你的迭代器,回到训练你的模型,等等。当然,你必须设置你的变量来重用=自动再利用这样做的时候。代码中的方法如下所示:</p>
<pre><code>from functools import partial
# Build model
...
with tf.variable_scope(..., reuse=tf.AUTO_REUSE):
...
...
def step_fn(fetches, feed_dict, step_context):
return step_context.session.run(fetches=fetches, feed_dict=feed_dict)
with tf.train.MonitoredTrainingSession(
checkpoint_dir=...,
save_checkpoint_steps=...,
hooks=[...],
...
) as mon_sess:
# Initialize iterators (assuming tf.Databases are used)
mon_sess.run_step_fn(
partial(
step_fn,
[train_it.initializer,
test_it.initializer,
...
],
{}
)
)
while not mon_sess.should_stop():
# Train session
for i in range(n):
try:
train_results = mon_sess.run(<train_fetches>)
except Exception as e:
break
# Test session
while True:
try:
test_results = mon_sess.run(<test_fetches>)
except Exception as e:
break
# Reinitialize parameters
mon_sess.run_step_fn(
partial(
step_fn,
[train_it.initializer,
test_it.initializer,
...
],
{}
)
)
</code></pre>
<p>部分函数只在mon中使用的步骤_fn上执行currying(函数编程中的经典函数)_sess.run_步骤\fn(). 上面的代码还没有经过测试,在开始测试之前,您可能需要重新初始化train_it,但希望现在可以清楚地知道如何在同一次运行中同时运行训练集和验证集。如果你想在同一个图中同时绘制训练曲线和测试曲线,这还可以与tensorboard的<a href="https://github.com/tensorflow/tensorboard/tree/master/tensorboard/plugins/custom_scalar" rel="nofollow noreferrer">custom_scalar tool</a>一起使用。在</p>
<p>最后,这是这个功能的最好的实现,我个人希望tensorflow将来能使这个功能的实现更容易,因为它非常乏味,而且可能没有那么高效。我知道有一些工具,比如<a href="https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator" rel="nofollow noreferrer">Estimator</a>可以运行<a href="https://www.tensorflow.org/api_docs/python/tf/estimator/train_and_evaluate" rel="nofollow noreferrer">train_and_evaluate</a>函数,但是由于这重建了每个列车和交叉验证运行之间的关系图,它非常适合如果只在一台计算机上运行,则效率很高。我在某个地方读到Keras+tf有这个功能,但是由于我不使用Keras+tf,这不是一个选项。不管怎样,我希望这能帮助其他人在同样的事情上挣扎!在</p>