簡體   English   中英

如何逐個應用二元交叉熵元素,然后在 Keras 中對所有這些損失求和?

[英]How do I apply the binary cross-entropy element-wise and then sum all these losses in Keras?

我想編寫一個帶有兩個參數AB的函數,具有相同形狀的張量(例如, 13x13或其他形狀),並返回一個數字,該數字表示應用二元交叉熵組件時所有損失的總和. 因此,對於A[i, j]B[i, j]我們找到二元交叉熵損失,然后對所有ij求和。 如何在 Keras 和 Tensorflow 中實現它?

您可以使用后端函數sumbinary_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()以對單個樣本的所有元素(而不是整個批次)求和。

這個答案中建議的解決方案實際上可能不是您(讀者)正在尋找的。

如果ABNxM ,其中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)之間的二元交叉熵,對於所有ij ,那么您可能首先想要重塑AB ,以便它們具有形狀(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)))

但是,如果要按元素計算AB之間的二元交叉熵並取所有二元交叉熵的平均值,則不需要重塑AB 所以,如果ABNxM陣列,然后binary_crossentropy(A, B)產生一個Nx1陣列,其中每個元素對應於行之間的平均二進制交叉熵iA和行iB (對於i=1, ..., N )。 最后,要取所有二元交叉熵的平均值,我們還需要取binary_crossentropy(A, B)的平均值,即tf.reduce_mean(binary_crossentropy(A, B))

暫無
暫無

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

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