Tensorflow SessionRunHook';要调用的成员函数?
在阅读了之后,我也不能理解SessionRunHook的用法。例如,SessionRunHook成员的顺序是什么 要调用的函数?是不是在创建会话之后->运行之前->开始->运行之后->结束-/code>? 我找不到有详细例子的教程,有更详细的解释吗?你可以找到一个教程,有点长,但你可以跳过构建网络的部分。或者根据我的经验,你也可以阅读我下面的小结 首先,应该使用Tensorflow SessionRunHook';要调用的成员函数?,tensorflow,Tensorflow,在阅读了之后,我也不能理解SessionRunHook的用法。例如,SessionRunHook成员的顺序是什么 要调用的函数?是不是在创建会话之后->运行之前->开始->运行之后->结束-/code>? 我找不到有详细例子的教程,有更详细的解释吗?你可以找到一个教程,有点长,但你可以跳过构建网络的部分。或者根据我的经验,你也可以阅读我下面的小结 首先,应该使用MonitoredSession而不是正常的会话 SessionRunHook扩展了session.run()对监视会话的调用 然后可以
MonitoredSession
而不是正常的会话
SessionRunHook扩展了session.run()
对监视会话的调用
然后可以找到一些常见的SessionRunHook
类。一个简单的方法是LoggingTensorHook
,但您可能希望在导入后添加以下行,以便在运行时查看日志:
tf.logging.set\u详细信息(tf.logging.INFO)
或者您可以选择实现自己的SessionRunHook
类。一个简单的是从
class\u LoggerHook(tf.train.SessionRunHook):
“”“记录丢失和运行时。”“”
def begin(自我):
自。_步骤=-1
self.\u start\u time=time.time()
运行前定义(自身,运行上下文):
自。_步数+=1
返回tf.train.SessionRunArgs(损失)#请求损失值。
运行后定义(自身、运行上下文、运行值):
如果self.\u步骤%FLAGS.log\u频率==0:
当前时间=time.time()
持续时间=当前时间-自身时间。\开始时间
自启动时间=当前时间
损失值=运行值。结果
示例每秒=FLAGS.log\u频率*FLAGS.batch\u大小/持续时间
每批次秒=浮动(持续时间/标志.日志频率)
格式\u str=(“%s:步骤%d,损失=%.2f(%.1f示例/秒;%.3f”
‘秒/批)’)
打印(格式\u str%(datetime.now(),self.\u步骤,丢失\u值,
示例(每秒钟,每批次)
其中,损失
在类外定义。此\u LoggerHook
使用print
打印信息,而LoggingTensorHook
使用tf.logging.INFO
最后,为了更好地理解它是如何工作的,执行顺序由带有MonitoredSession
的伪代码表示:
调用hooks.begin()
sess=tf.Session()
调用hooks.after_create_session()
请求不停止时:#py代码:不停止时。是否应停止():
调用hooks.before_run()
尝试:
结果=sess.run(合并的\u获取,提要\u dict=合并的\u提要)
除了(errors.OutOfRangeError,StopIteration):
打破
调用hooks.after_run()
调用hooks.end()
sess.close()
希望这能有所帮助。tf.SessionRunHook
使您能够在代码中执行的每个会话运行命令期间添加自定义代码。为了理解它,我在下面创建了一个简单的示例:
我们希望在每次更新参数后打印损耗值
我们将使用SessionRunHook
来实现这一点
创建一个tensorflow图
将tensorflow导入为tf
将numpy作为np导入
x=tf.placeholder(shape=(10,2),dtype=tf.float32)
w=tf.变量(初始值=[[10.],[10.]]
w0=[[1],[1.]]
y=tf.matmul(x,w0)
损失=tf.reduce_平均值((tf.matmul(x,w)-y)**2)
优化器=tf.序列AdamOptimizer(0.001).最小化(损失)
创建挂钩
class\u Hook(tf.train.SessionRunHook):
定义初始(自我,丢失):
自我损失=损失
def begin(自我):
通过
运行前定义(自身,运行上下文):
返回tf.train.SessionRunArgs(self.loss)
运行后定义(自身、运行上下文、运行值):
损失值=运行值。结果
打印(“损失值:”,损失值)
使用钩子创建受监控会话
sess = tf.train.MonitoredSession(hooks=[_Hook(loss)])
列车
for _ in range(10):
x_ = np.random.random((10, 2))
sess.run(optimizer, {x: x_})
# Output
loss value: 21.244701
loss value: 19.39169
loss value: 16.02665
loss value: 16.717144
loss value: 15.389178
loss value: 16.23935
loss value: 14.299083
loss value: 9.624525
loss value: 5.654896
loss value: 10.689494
谢谢你的详细解释。你知道有没有可能在cpu上安装一个钩子来进行验证?我有一个用例,其中验证指标消耗了太多内存。目前,我在启用CPU/GPU交换的情况下使用tf.map_fn迭代批处理,但我怀疑这是无效的。这是在估计器的训练模式内将事情记录到tensorboard的唯一方法吗?在运行
之前,我如何获得的返回值?在你的例子中,我只看到了run之后的。