Tensorflow SessionRunHook';要调用的成员函数?

Tensorflow SessionRunHook';要调用的成员函数?,tensorflow,Tensorflow,在阅读了之后,我也不能理解SessionRunHook的用法。例如,SessionRunHook成员的顺序是什么 要调用的函数?是不是在创建会话之后->运行之前->开始->运行之后->结束-/code>? 我找不到有详细例子的教程,有更详细的解释吗?你可以找到一个教程,有点长,但你可以跳过构建网络的部分。或者根据我的经验,你也可以阅读我下面的小结 首先,应该使用MonitoredSession而不是正常的会话 SessionRunHook扩展了session.run()对监视会话的调用 然后可以

在阅读了之后,我也不能理解SessionRunHook的用法。例如,SessionRunHook成员的顺序是什么 要调用的函数?是不是在创建会话之后->运行之前->开始->运行之后->结束-/code>? 我找不到有详细例子的教程,有更详细的解释吗?

你可以找到一个教程,有点长,但你可以跳过构建网络的部分。或者根据我的经验,你也可以阅读我下面的小结

首先,应该使用
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之后的