【问题标题】:Tensorflow: How to feed a placeholder variable with a tensor?Tensorflow:如何用张量提供占位符变量?
【发布时间】:2018-08-29 22:06:24
【问题描述】:

我有一个占位符变量,它需要一批输入图像:

input_placeholder = tf.placeholder(tf.float32, [None] + image_shape, name='input_images')

现在我有 2 个输入数据来源:
1) 张量和
2)一些numpy数据。

对于 numpy 输入数据,我知道如何将数据提供给占位符变量:

sess = tf.Session()
mLoss, = sess.run([loss], feed_dict = {input_placeholder: myNumpyData})

如何将张量提供给该占位符变量?

mLoss, = sess.run([loss], feed_dict = {input_placeholder: myInputTensor})

给我一​​个错误:

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.

我不想使用.eval() 将张量转换为 numpy 数组,因为这会减慢我的程序速度,还有其他方法吗?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    这在 2016 年已经在 GitHub 上讨论过,请查看here。这里是concretevitamin的重点:

    需要注意的一个关键点是张量只是一个符号对象。 feed_dict 的值是实际值,例如一个 Numpy ndarry。

    张量作为符号对象在图中流动,而实际值在其外部,那么我们只能将实际值传递到图中,而符号对象不能存在于图之外。

    【讨论】:

      【解决方案2】:

      您可以使用feed_dict 将数据输入非占位符。因此,首先,将您的数据流图直接连接到您的 myInputTensor 张量数据源(即不要使用占位符)。然后,当您想使用 numpy 数据运行时,您可以使用 myNumpyData 有效地屏蔽 myImportTensor,如下所示:

      mLoss, = sess.run([loss], feed_dict={myImportTensor: myNumpyData})
      

      [不过,我仍在试图弄清楚如何使用多个张量数据源来做到这一点。]

      【讨论】:

        【解决方案3】:

        解决问题的一种方法是实际删除占位符张量并将其替换为您的“myInputTensor”。

        您将使用 myInputTensor 作为图表中其他操作的源,并且当您想以 np 数组作为输入数据来推断图表时,您将直接向该张量提供一个值。

        这是一个简单的例子:

        import tensorflow as tf 
        import numpy as np
        
        # Input Tensor
        myInputTensor = tf.ones(dtype=tf.float32, shape=1) # In your case, this would be the results of some ops
        
        output = myInputTensor * 5.0
        
        with tf.Session() as sess:
            print(sess.run(output)) # == 5.0, using the Tensor value
            myNumpyData = np.zeros(1)
            print(sess.run(output, {myInputTensor: myNumpyData}) # == 0.0 * 5.0 = 0.0, using the np value
        

        【讨论】:

          【解决方案4】:

          这适用于我的最新版本...也许你有旧版本的 TF?

          a = tf.Variable(1)
          sess.run(2*a, feed_dict={a:5}) # prints 10
          

          【讨论】:

          • 好吧,这将为其提供数据。我需要的是feed_dict={a: someTensorObject}
          • 正确,feed_dict 仅用于馈送数据。如果您想提供张量,请使用常规 TensorFlow API。即,tf.add(a,b)“馈送”abtf.add。你可能想要sess.run(a.assign(someTensorObject))
          猜你喜欢
          • 1970-01-01
          • 2016-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-02
          • 2017-06-10
          • 1970-01-01
          相关资源
          最近更新 更多