在代码下面运行:
loss = tf.losses.softmax_cross_entropy(onehot_labels=training_outputs, logits=logits)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)
init = tf.global_variables_initializer()
# define placeholder for inputs to network
xs = tf.placeholder(tf.float32,[None,2000])
ys = tf.placeholder(tf.float32,[None,81])
with tf.Session() as sess:
sess.run(init)
for i in range(1000):
sess.run(optimizer, feed_dict={xs:training_inputs, ys:training_outputs})
返回错误:
InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_150' with dtype float
[[Node: Placeholder_150 = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
我认为这与training_inputs
&的格式有关。 training_outputs
即:
training_inputs
& training_outputs
是一个热门编码。但是每个都应该是array([],[]....)
而不是array([[],[],...])
?
答案 0 :(得分:2)
training_inputs& training_outputs是一个热门编码。但是每个都应该是array([],[] ....)而不是array([[],[],...])?
不,输入和输出看起来很好。
错误表示您没有提供运行optimizer
张量所需的占位符。从错误消息(Placeholder_150
)中的占位符名称可以看出,您已经创建了许多占位符。
当您将笔记本与tensorflow结合使用时,您需要知道的一件事是每次使用
执行单元格时xs = tf.placeholder(tf.float32,[None,2000])
ys = tf.placeholder(tf.float32,[None,81])
新的占位符将添加到图表中。第一次执行时"Placeholder_0"
和"Placeholder_1"
将第二次添加"Placeholder_2"
和"Placeholder_3"
,依此类推。
问题可能是xs
或ys
不能引用用于计算optimizer
的相同占位符。
例如,如果您先执行
,就会发生这种情况 xs = tf.placeholder(tf.float32,[None,2000])
ys = tf.placeholder(tf.float32,[None,81])
然后从optimizer
和xs
构建ys
然后执行
xs = tf.placeholder(tf.float32,[None,2000])
ys = tf.placeholder(tf.float32,[None,81])
再次运行会话之前。
修改强>:
创建optimizer
张量后创建占位符也是错误的。由于optimizer
应取决于这些占位符。它应该在您第一次运行笔记本时出错,但第二次它可能导致您得到的错误。
答案 1 :(得分:0)
我认为你对损失计算感到困惑
# Here onehot_labels is not exactly the training outputs data, but the ground truths labels placeholder <ys> of your training data <xs>
# this line should be replaced with
loss = tf.losses.softmax_cross_entropy(onehot_labels=training_outputs, logits=logits)
# this one
loss = tf.losses.softmax_cross_entropy(onehot_labels=ys, logits=logits)