首页 文章

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

提问于
浏览
6

我正在构建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_ ,num_classes]和dtype float32或float64的非标定日志概率 . 标签:形状张量[d_0,d_1,...,d_]和dtype int32或int64 . 标签中的每个条目必须是[0,num_classes)中的索引 .

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

4 回答

  • 4

    为何要

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

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

  • 6

    来自 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 .

  • 1

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

  • 1

    In short, here is implements of it

    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(每个小批量条目)的真实类提供单个特定索引 . 对于具有每个条目的概率分布的软softmax分类,请参阅softmax_cross_entropy_with_logits . 警告:此操作需要未缩放的logits,因为它在内部执行logmax以提高效率 . 不要使用softmax的输出调用此op,因为它会产生不正确的结果 . 常见的用例是使用shape [batch_size,num_classes]和shape [batch_size]标签的logits . 但支持更高的尺寸 . 请注意,为避免混淆,需要仅将命名参数传递给此函数 .

    softmax_cross_entropy_with_logits_v2softmax_cross_entropy_with_logits

    计算logits和标签之间的softmax交叉熵 . (已弃用)此功能已被弃用 . 它将在未来版本中删除 . 更新说明:TensorFlow的未来主要版本将允许渐变在默认情况下流入backprop上的标签输入 . 反向传播仅发生在logits中 . 要计算允许反向传播到logits和标签的交叉熵损失,请参阅softmax_cross_entropy_with_logits_v2测量离散分类任务中的概率误差,其中类是互斥的(每个条目恰好在一个类中) . 例如,每个CIFAR-10图像都标有一个且只有一个标签:图像可以是狗或卡车,但不能同时使用两者 .

    here is the same implements of softmax_cross_entropy_with_logits_v2

    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
                logits=hypothesis,labels=Y))
    

相关问题