为什么这个TensorFlow代码段在投放过程中引发错误?

时间:2018-12-17 08:50:44

标签: python numpy tensorflow

代码

#!/usr/bin/env python3
import tensorflow as tf
import numpy as np

def customOps(n):
  x = tf.placeholder(tf.float32)
  v1 = tf.reduce_sum(x,1)
  v2 = tf.reduce_sum(x,0)
  v = tf.nn.softmax(tf.concat([v1, v2], 0))
  index = np.argmax(v)
  if index > n/3:
    finalval = tf.norm(v1-v2, ord='euclidean')
  else:
    finalval = tf.norm(v1+v2, ord='euclidean')
  return finalval

if __name__ == '__main__':
  mat = np.asarray([[0, 1], [1, 0]], dtype = np.float32)
  n = mat.shape[0]

  finalVal = customOps(n)

  init = tf.global_variables_initializer()
  sess = tf.Session()
  sess.run(init)
  outVal = sess.run(finalVal, feed_dict={x:mat})
  print(outVal)
  sess.close()

引发错误

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_5' with dtype float [[{{node Placeholder_5}} = Placeholder[dtype=DT_FLOAT, shape=<unknown>, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

上述代码段的sess.run(init)行中引发了错误。我正在通过feed_dict提供一个float类型的数组,但不确定为什么会引发错误。

错误在哪里,为什么?

1 个答案:

答案 0 :(得分:2)

为什么会出错:

因为您在一个不干净的图中多次运行了相同的代码段(即您的图具有网络的多个副本)。 我可以说的原因是错误消息中节点名称末尾的_5。如果已经使用名称,则TF使用增量索引为图形中的所有张量分配默认名称。 Placeholder_5表示在同一图中至少有5个Placeholder实例未分配自定义默认名称,根据您的代码,除非您调用函数multi次数而不清理图表。

如何修复:

以干净的图形运行:将tf.reset_default_graph()放在finalVal = customOps(n)之前。

注意:您的代码存在的问题更多(例如,您在主分支中有x,但是x是{{1}的局部变量) }),但是导致错误的原因是上述原因。 在下面,您可以找到可以解决这两个问题的经过测试的有效版本。

customOps