首页 > 解决方案 > tensorflow 中损失的 logits 可以是占位符

问题描述

我使用 tensorflow 来实现手写数字识别。希望softmax_cross_entropy_with_logits中的logits先用占位符表示,然后在计算的时候通过计算的值传给占位符,但是tensorflow会报错ValueError: No gradients provided for any variable, check Your graph for ops that do not support渐变。我知道直接将 logits 更改为输出是可以的,但如果我必须使用 logits,结果首先是占位符。我该如何解决?

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/home/as/downloads/resnet-152_mnist-master/mnist_dataset", one_hot=True)

from tensorflow.contrib.layers import fully_connected

x = tf.placeholder(dtype=tf.float32,shape=[None,784])
y = tf.placeholder(dtype=tf.float32,shape=[None,10])

hidden1 = fully_connected(x,100,activation_fn=tf.nn.elu,
                         weights_initializer=tf.random_normal_initializer())

hidden2 = fully_connected(hidden1,200,activation_fn=tf.nn.elu,
                         weights_initializer=tf.random_normal_initializer())
hidden3 = fully_connected(hidden2,200,activation_fn=tf.nn.elu,
                         weights_initializer=tf.random_normal_initializer())


outputs = fully_connected(hidden3,10,activation_fn=None,
                         weights_initializer=tf.random_normal_initializer())




a = tf.placeholder(tf.float32,[None,10])


loss = tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=a)
reduce_mean_loss = tf.reduce_mean(loss)

equal_result = tf.equal(tf.argmax(outputs,1),tf.argmax(y,1))
cast_result = tf.cast(equal_result,dtype=tf.float32)
accuracy = tf.reduce_mean(cast_result)

train_op = tf.train.AdamOptimizer(0.001).minimize(reduce_mean_loss)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(30000):
        xs,ys = mnist.train.next_batch(128)
        result = outputs.eval(feed_dict={x:xs})
        sess.run(train_op,feed_dict={a:result,y:ys})
        print(i)

标签: pythontensorflowmachine-learningneural-networkdeep-learning

解决方案


简而言之,损失中的 logits 不能是占位符,而需要是 tensorflow Operation。否则,您的优化器无法计算任何变量的梯度(请参阅错误消息)。

操作是“对张量执行计算的图节点”,而占位符是在评估图时需要馈送的张量。我不太明白,为什么不直接将输出操作分配给 logits,如下所示:

loss = tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=outputs)

如果您提供特殊用例,我可以尝试进一步帮助您吗?


推荐阅读