算法工程师修仙之路:TensorFlow(三)

TensorFlow 入门

TensorFlow 运行模型一一会话


  • TensorFlow 使用会话(session)来执行定义好的运算。

  • 会话拥有并管理 TensorFlow 程序运行时的所有资源。

  • 所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。

  • TensorFlow 中使用会话的模式一般有两种。

    • 第一种模式需要明确调用会话生成函数和关闭会话函数。
      • 使用这种模式时,在所有计算完成之后,需要明确调用 Session.close 函数来关闭会话并释放资源。
      • 然而,当程序因为异常而退出时,关闭会话的函数可能就不会被执行从而导
        致资源泄漏。
    • 第二种模式需要使用with来管理会话。
      • 为了解决异常退出时资源释放的问题,TensorFlow 可以通过 Python 的上下文管理器来使用会话。
      • 通过 Python 上下文管理器的机制,只要将所有的计算放在“with”的内部就可以。
      • 当上下文管理器退出时候会自动释放所有资源,这样既解决了因为异常退出时资源释放的问题,同时也解决了忘记调用 Session.close 函数而产生的资源泄漏。
      # 以向量加法为例,当运行如下代码时,并不会得到加法的结果,而会得到对结果的一个引用。
      import tensorflow as tf 
      # tf.constant是一个计算,这个计算的结果为一个张量,保存在变量a中。
      a = tf.constant([1.0, 2.0], name="a")
      b = tf.constant([2.0, 3.0], name="b")
      result = tf.add(a, b, name="add")
      print(result)
      # 输出:Tensor("add:0", shape=(2,), dtype=float32)
      
      # 第一种模式:创建一个会话。
      sess = tf.Session()
      # 使用这个创建好的会话来得到关心的运算的结果。
      # 比如可以调用sess.run(result)来得到张量result的取值。
      print(sess.run(result))
      # 关闭会话使得本次运行中使用到的资源可以被释放。
      sess.close()
      # 输出[ 3.  5.]
      
      # 第二种模式:创建一个会话,并通过Python中的上下文管理器来管理这个会话。
      with tf.Session() as sess:
          # 使用创建好的会话来计算关心的结果。
          print(sess.run(result))
      """ 
      不需要再调用“Session.close()”函数来关闭会话,
      当上下文退出时会话关闭和资源释放也自动完成了。
      """
      # 输出[ 3.  5.]
      
  • TensorFlow 会自动生成一个默认的计算图,如果没有特殊指定,运算会自
    动加入这个计算图中,TensorFlow 中的会话也有类似的机制,但 TensorFlow 不会自动生成默认的会话,而是需要手动指定。当默认的会话被指定之后,可以通过 tf.Tensor.eval 函数来计算一个张量的取值 。

  • 在交互式环境下(比如 Python 脚本或者 Jupyter 的编辑器下),通过设置默认会话的方式来获取张量的取值更加方便。所以 TensorFlow 提供了 一种在交互式环境下直接构建默认会话的函数。这个函数就是 tf.lnteractiveSession,使用这个函数会自动将生成的会话注册为默认会话。

    # 通过设定默认会话计算张量的取值。
    import tensorflow as tf
    a = tf.constant([1.0, 2.0], name="a")
    b = tf.constant([2.0, 3.0], name="b")
    result = tf.add(a, b, name="add")
    
    sess = tf.Session()
    with sess.as_default():
        print(result.eval())
    # 输出[ 3.  5.]
    
    sess = tf.Session()
    # 以下两个命令有相同的功能。
    print(sess.run(result))
    print(result.eval(session=sess))
    sess.close()
    # 输出两个[ 3.  5.]
    
    # 通过tf.InteractiveSession函数可以省去将产生的会话注册为默认会话的过程。
    sess = tf.InteractiveSession()
    print(sess.run(result))
    sess.close()
    # 输出[ 3.  5.]
    
  • ConfigProto配置会话

    • 无论使用哪种方法都可以通过 ConfigProto Protocol Buffer来配置需要生成的会话。
    • 通过 ConfigProto 可以配置类似并行的线程数、GPU 分配策略、运算超时时间等参数。
    • 在这些参数中,最常使用的有两个。
      • 第一个是 allow_soft_placement,这是一个布尔型的参数,当它为 True 时, 在以下任意一个条件成立时,GPU 上的运算可 以放到 CPU 上进行:
        • 运算无法在 GPU 上执行。
        • 没有 GPU 资源(比如运算被指定在第二个 GPU 上运行,但是机器只有个 GPU)。
        • 运算输入包含对 CPU 计算结果的引用。
      • 这个参数的默认值为False,但是为了使得代码的可移植性更强,在有 GPU 的环境下这个参数一般会被设置为True。不同的 GPU 驱动版本可能对计算的支持有略微的区别,通过 allow_soft_placement 参数设为True,当某些运算无法被当前 GPU 支持时,可以自动调整到 CPU 上,而不是报错。类似地,通过将这个参数设置为 True,可以让程序在拥有不同数量的 GPU 机器上顺利运行。
      • 第二个使用得比较多的配置参数是 log_device_placement ,这也是一个布尔型的参数,当它为 True 时日志中将会记录每个节点被安排在哪个设备上以方便调试。而在生产环境中将这个参数设置为 False 可以减少日志量。

猜你喜欢

转载自blog.csdn.net/faker1895/article/details/85873079
今日推荐