簡體   English   中英

排名不匹配:標簽排名(收到2)應該等於logits排名減去1(收到2)

[英]Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2)

我正在構建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。 這將解決問題。

簡而言之,這是它的實現

    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

警告:此操作需要未縮放的日志,因為它在內部執行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圖像都標有一個且只有一個標簽:圖像可以是狗或卡車,但不是兩者。

這是softmax_cross_entropy_with_logits_v2的相同實現

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

為什么要

“常見的用例是對形狀[batch_size,num_classes]和形狀標簽[batch_size]進行記錄。但支持更高的尺寸。”

在許多教程中,包括此處此處 ,標簽的大小為[None,10] ,logits的大小為[None,10]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM