排名不匹配:标签排名(收到2)应该等于logits排名减1(收到2)

时间:2016-10-31 21:26:37

标签: python image-processing neural-network tensorflow conv-neural-network

我正在构建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)应该等于logits排名   减1(收到2)。

我想我应该重塑标签层,但不确定它的期望。我抬头看了documentation,然后说:

  

logits:秩r和形状的非标定日志概率[d_0,d_1,...,   d_ {r-2},num_classes]和dtype float32或float64。标签:Tensor of   shape [d_0,d_1,...,d_ {r-2}]和dtype int32或int64。每个条目   标签必须是[0,num_classes)中的索引。

如果我只有单一课程,我的标签应该是什么样的(现在它只是0或1)?任何帮助表示赞赏

4 个答案:

答案 0 :(得分:7)

来自tf.nn.sparse_softmax_cross_entropy_with_logits的文档*:

  

"一个常见的用例是具有形状的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

答案 1 :(得分:5)

问题可能是网络中的激活功能。使用tf.nn.softmax_cross_entropy_with_logits而不是sparse_softmax。这将解决问题。

答案 2 :(得分:2)

简而言之,这是它的实现

    cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
            logits=hypothesis,labels=tf.argmax(Y,1)))

sparse_softmax_cross_entropy_with_logits

  

计算logits和标签之间的稀疏softmax交叉熵

     

测量离散分类任务中的概率误差   哪些类互斥(每个条目都是完全正确的   一节课)。

     

例如,每个CIFAR-10图像都标有一个且只有一个   标签:图像可以是狗或卡车,但不是两者。

     

注意:对于此操作,给定标签的概率   被视为独家。也就是说, 不允许使用软类 ,   并且标签向量必须为提供单个特定索引   每行logits的真实类(每个小批量条目)。

     

对于具有概率分布 soft softmax分类   对于每个条目,请参阅 softmax_cross_entropy_with_logits

     

警告:此操作需要未缩放的logits,因为它执行softmax   在内部进行logits以提高效率。不要把这个叫做   softmax的输出,因为它会产生不正确的结果。

     

一个常见的用例是具有形状的logits [batch_size,num_classes]   和形状标签[batch_size]。但是支持更高的尺寸。

     

请注意,为避免混淆,需要仅传递命名   这个函数的参数。

softmax_cross_entropy_with_logits_v2softmax_cross_entropy_with_logits

  

计算logits和标签之间的softmax交叉熵。 (已弃用)

     

此功能已被弃用。它将在以后的版本中删除。

     

更新说明:

     

TensorFlow的未来主要版本将允许渐变流入   默认情况下在backprop上输入的标签。反向传播将发生   只进入logits。计算允许的交叉熵损失   反向传播到logits和标签,请参阅 softmax_cross_entropy_with_logits_v2

     

测量离散分类任务中的概率误差   哪些类是互斥的(每个条目只有一个   类)。

     

例如,每个CIFAR-10图像都标有一个且只有一个   标签:图像可以是狗或卡车,但不是两者。

这里是 softmax_cross_entropy_with_logits_v2

的相同工具
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
            logits=hypothesis,labels=Y))

答案 3 :(得分:1)

为什么要

  

“常见的用例是记录形状[batch_size,num_classes]和形状标签[batch_size]。但支持更高的尺寸。”

在许多教程中,包括herehere,标签的大小为[None,10],而且logits的大小也为[None,10]