我正在构建DNN来预测图像中是否存在对象.我的网络有两个隐藏层,最后一层看起来像这样:
# Output layer W_fc2 = weight_variable([2048, 1]) b_fc2 = bias_variable([1]) y = tf.matmul(h_fc1, W_fc2) + b_fc2
然后我有标签的占位符:
y_ = tf.placeholder(tf.float32, [None, 1], 'Output')
我分批进行训练(因此输出图层形状中的第一个参数为无).
我使用以下损失函数:
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( y[:, :1], y_[:, :1], name='xentropy') loss = tf.reduce_mean(cross_entropy, name='xentropy_mean') predict_hand = tf.greater(y, 0.5) correct_prediction = tf.equal(tf.to_float(predict_hand), y_) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
但在运行时我收到以下错误:
等级不匹配:标签等级(收到2)应等于对数等级减1(接收2).
我想我应该重塑标签层,但不确定它的期望.我查阅了文档,它说:
logits:秩r和形状[d_0,d_1,...,d_ {r-2},num_classes]和dtype float32或float64的非标定日志概率.标签:形状张量[d_0,d_1,...,d_ {r-2}]和dtype int32或int64.标签中的每个条目必须是[0,num_classes)中的索引.
如果我只有一个单独的类,我的标签应该是什么样的(现在它只是0或1)?任何帮助赞赏
从文档*为tf.nn.sparse_softmax_cross_entropy_with_logits
:
"常见的用例是对形状[batch_size,num_classes]和形状标签[batch_size]进行记录.但支持更高的尺寸."
所以我认为你的标签张量应该是合适的[None]
.请注意,具有形状[None, 1]
或形状的给定张量[None]
将包含相同数量的元素.
具有具体虚拟值的示例输入:
>>> logits = np.array([[11, 22], [33, 44], [55, 66]]) >>> labels = np.array([1, 0, 1])
小批量中有3个例子,logits
第一个例子是11和22,有2个类:0和1.
*https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits
问题可能出在您网络中的激活功能上。使用tf.nn.softmax_cross_entropy_with_logits而不是sparse_softmax。这样可以解决问题。