![](/img/trans.png)
[英]How can I calculate cross-entropy on a sigmoid neural network binary outcome?
[英]How do I apply the binary cross-entropy element-wise and then sum all these losses in Keras?
我想編寫一個帶有兩個參數A
和B
的函數,具有相同形狀的張量(例如, 13x13
或其他形狀),並返回一個數字,該數字表示應用二元交叉熵組件時所有損失的總和. 因此,對於A[i, j]
和B[i, j]
我們找到二元交叉熵損失,然后對所有i
和j
求和。 如何在 Keras 和 Tensorflow 中實現它?
您可以使用后端函數sum
和binary_crossentropy
輕松定義此函數(或直接在 Tensorflow 中使用它們的等效項):
def func(A, B):
return K.sum(K.binary_crossentropy(A,B))
注意K.binary_crossentropy()
假設給定的輸入值是概率; 如果情況並非如此,則將from_logit=True
作為另一個參數傳遞給它。
此外,如果您想在Lambda
層中使用此函數,則需要對其進行更改,使其接受張量列表作為輸入:
def func(inp):
return K.sum(K.binary_crossentropy(inp[0], inp[1]), [1,2]) # take the sum for each sample independently
# ...
out = Lambda(func)([A, B])
如您所見, [1,2]
已作為其axis
參數傳遞給K.sum()
以對單個樣本的所有元素(而不是整個批次)求和。
這個答案中建議的解決方案實際上可能不是您(讀者)正在尋找的。
如果A
和B
是NxM
,其中M > 1
,則binary_crossentropy(A, B)
將不會計算二進制交叉熵元素,但binary_crossentropy(A, B)
返回形狀為Nx1
的數組,其中binary_crossentropy(A, B)[i]
對應於A[i]
和B[i]
之間的平均二元交叉熵(即它計算A[i][j]
和B[i][j]
之間的二元交叉熵,對於所有j
,然后它計算M
二元交叉熵的平均值)。
如果您想計算元素A(i, j)
和B(i, j)
之間的二元交叉熵,對於所有i
和j
,那么您可能首先想要重塑A
和B
,以便它們具有形狀(N*M)x1
。
import numpy as np
import tensorflow as tf
a = np.random.rand(4, 2).reshape((-1, 1))
b = np.random.rand(4, 2).reshape((-1, 1))
print("ce between a[i, j] and b[i, j]) =", tf.losses.binary_crossentropy(a, b))
print("average cross-entropy =", np.mean(tf.losses.binary_crossentropy(a, b)))
但是,如果要按元素計算A
和B
之間的二元交叉熵並取所有二元交叉熵的平均值,則不需要重塑A
和B
。 所以,如果A
和B
的NxM
陣列,然后binary_crossentropy(A, B)
產生一個Nx1
陣列,其中每個元素對應於行之間的平均二進制交叉熵i
的A
和行i
的B
(對於i=1, ..., N
)。 最后,要取所有二元交叉熵的平均值,我們還需要取binary_crossentropy(A, B)
的平均值,即tf.reduce_mean(binary_crossentropy(A, B))
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.