TensorFlow无效参数错误:您必须为dtype为float的占位符张量提供值。

3

我刚接触tensorflow,并想训练一个用于分类的逻辑回归模型。

# Set model weights
W = tf.Variable(tf.zeros([30, 16]))
b = tf.Variable(tf.zeros([16]))
train_X, train_Y, X, Y = input('train.csv')

#construct model
pred = model(X, W, b)
# Minimize error using cross entropy
cost = tf.reduce_mean(-tf.reduce_sum(Y*tf.log(pred), reduction_indices=1))
# Gradient Descent
learning_rate = 0.1
#optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# Initializing the variables
init = tf.initialize_all_variables()

get_ipython().magic(u'matplotlib inline')
import collections
import matplotlib.pyplot as plt

training_epochs = 200
batch_size = 300
train_X, train_Y, X, Y = input('train.csv')
acc = []
x = tf.placeholder(tf.float32, [None, 30]) 
y = tf.placeholder(tf.float32, [None, 16])
with tf.Session() as sess:
     sess.run(init)
     # Training cycle
     for epoch in range(training_epochs):
         avg_cost = 0.0
         #print(type(y_train[0][0]))
         print(type(train_X))
         print(type(train_X[0][0]))
         print X
         _, c = sess.run([optimizer, cost], feed_dict = {x: train_X, y: train_Y})

feef_dict方法无法使用,提示如下:

InvalidArgumentError: 您必须为数据占位符张量 'Placeholder_54' 提供一个值,其数据类型为 float [[Node: Placeholder_54 = Placeholderdtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]] 原因来自操作 u'Placeholder_54':

我检查了训练特征数据 X 的数据类型:

  train_X type: <type 'numpy.ndarray'>
  train_X[0][0]: <type 'numpy.float32'>
  train_X size: (300, 30)
  place_holder info : Tensor("Placeholder_56:0", shape=(?, 30), dtype=float32)

我不知道为什么它会抱怨。希望有人可以帮忙,谢谢。


如果你在Jupyter Notebook中,尝试在定义变量之前运行tf.reset_default_graph()。我遇到了一些类似的问题,这是其中帮助解决的方法之一。 - Engineero
4个回答

3
根据您的错误信息,缺失的占位符名称为 'Placeholder_54',这似乎表明至少已在当前解释器会话中创建了 54 个占位符。
还没有足够的细节来确定问题,但我有些怀疑。您是否在同一解释器会话中多次运行相同的代码(例如使用 IPython/Jupyter 或 Python shell)?如果是这种情况,我怀疑您的 cost 张量依赖于之前执行过的代码创建的占位符。
事实上,您的代码在构建模型的其余部分后创建了两个tf.placeholder() 张量 xy,因此可能是以下情况之一:
  1. 缺失的占位符是在之前执行此代码时创建的,或者

  2. input() 函数在内部调用了 tf.placeholder(),并且应该提供这些占位符(也许是张量 XY?)。


1
我认为我遇到了类似的错误。看起来你的图表上没有那些张量的x、y,你创建了相同名称的占位符,但这并不意味着你在图表中得到了那些名称的张量。
这是我的问题链接(我自己回答了):link 使用此方法获取图表中的所有张量(非常有用):
[n.name for n in tf.get_default_graph().as_graph_def().node]

0
展示model()的代码 - 我打赌它定义了两个占位符:X是placeholder_56,那么placeholder_54从哪里来?
然后将模型x、y传递到feed_dict中,删除你的x、y全局占位符,一切都会正常工作 :)

0

或许你可以尝试添加图形 with tf.Graph().as_default(): 来避免在运行jupyter笔记本或ipython时重新定义占位符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接