【问题标题】:tf.print() vs Python print vs tensor.eval()tf.print() vs Python print vs tensor.eval()
【发布时间】:2019-12-19 12:49:00
【问题描述】:

好像在Tensorflow中,至少有3种方法可以打印出一个张量的值。我一直在阅读herethere,但仍然很困惑。

这些作者似乎将不同的用法总结为:

  • Python print:只能打印出张量的某些属性,例如它的形状,因为在计算图之外它只是一个操作。
  • tensor.eval() :不确定它与 tf.print() 的区别
  • tf.print(): 可以输出一个张量的实际值,但必须插入到图中的某处以及被其他一些操作使用,否则它将悬空并且仍然不打印。

我的困惑可能还在于我不确定我们可以在张量流计算图中访问多少 Python 功能,或者计算图“结束”和 Python 代码“开始”在哪里。例如

  1. 如果我在构建计算图的两行之间插入 Python 打印,当我稍后调用 sess.run() 时,会调用此行吗?
  2. 如果我想在计算图中打印出多个张量值,我应该把这些语句放在哪里?
  3. tensor.eval()tf.print() 有什么区别?我应该如何以不同的方式使用它们?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    第一次构建图形时将调用原生 Python print() 语句。看看这个:

    a = tf.placeholder(shape=None, dtype=tf.int32)
    b = tf.placeholder(shape=None, dtype=tf.int32)
    print("a is ",a," while b is ",b)
    c = tf.add(a, b)
    with tf.Session() as sess:
        print(sess.run(c, feed_dict={a: 1, b: 2}))
        print(sess.run(c, feed_dict={a: 3, b: 1}))
    

    通过执行此代码块,输出为:

    # a is  Tensor("Placeholder:0", dtype=int32)  while b is  Tensor("Placeholder_1:0", dtype=int32)
    # 3
    # 4
    

    另一方面,让我们看看tf.print()

    a = tf.placeholder(shape=None, dtype=tf.int32)
    b = tf.placeholder(shape=None, dtype=tf.int32)
    print_op = tf.print("a is ",a," while b is ",b)
    with tf.control_dependencies([print_op]):
        c = tf.add(a, b)
    
    with tf.Session() as sess:
        print(sess.run(c, feed_dict={a: 1, b: 2}))
        print(sess.run(c, feed_dict={a: 3, b: 1}))
    

    所以,根据下面的输出,我们可以看到,如果我们添加 tf.print 操作必须在每次运行 c 时运行的依赖项,我们就可以看到我们想要的输出:

    # a is  1  while b is  2
    # 3
    # a is  3  while b is  1
    # 4
    

    最后,tensor.eval()sess.run(tensor) 相同。但是,tensor.eval() 的局限性在于您可以运行它来评估单个张量,而tf.Session 可以用于评估多个张量sess.run([tensor1, tensor2])。如果你问我,我会一直使用 sess.run(list_of_tensors) 来评估我想要的任意数量的张量,并打印出它们的值。

    【讨论】:

      【解决方案2】:
      1. 没有。稍后调用sess.run() 时不会调用Python print
        如果您想在调用sess.run() 时打印,则可以使用tf.print

      2. 要在图中打印出多个张量值,应在打开tf.Session() 后使用sess.run()。示例代码如下。

      t = tf.constant(42.0)
      u = tf.constant(37.0)
      pt = tf.print(t)
      pu = tf.print(u)
      with sess.as_default():
         sess.run([pt, pu])
      
      42
      37
      
      1. This answerthis 在另一个问题中会有所帮助。
        tensor.eval() 评估张量运算并且不是运算符。
        tf.print() 只是一个打印给定张量的运算符。所以在调用tf.Session() 之后,tf.print() 将成为图节点之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-15
        • 2023-03-17
        • 2017-08-07
        • 2012-08-20
        • 2020-01-18
        • 2011-07-08
        • 2012-05-21
        • 2018-07-15
        相关资源
        最近更新 更多