![](/img/trans.png)
[英]ValueError: Shape mismatch: The shape of labels (received (1,)) should equal the shape of logits except for the last dimension (received (10, 30))
[英]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。
問題可能是網絡中的激活功能。 使用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_v2和softmax_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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.