Función de entropía cruzada (python)
Estoy aprendiendo la red neuronal y quiero escribir una función.cross_entropy
en pitón Donde se define como
dóndeN
es el número de muestrask
es el número de claseslog
es el logaritmo naturalt_i,j
es 1 si muestrai
esta en clasej
y0
de lo contrario, yp_i,j
es la probabilidad pronosticada de que la muestrai
esta en clasej
. Para evitar problemas numéricos con el logaritmo, recorte las predicciones a[10^{−12}, 1 − 10^{−12}]
distancia.
De acuerdo con la descripción anterior, escribí los códigos recortando las predicciones para[epsilon, 1 − epsilon]
rango, luego calculando la cross_entropy según la fórmula anterior.
def cross_entropy(predictions, targets, epsilon=1e-12):
"""
Computes cross entropy between targets (encoded as one-hot vectors)
and predictions.
Input: predictions (N, k) ndarray
targets (N, k) ndarray
Returns: scalar
"""
predictions = np.clip(predictions, epsilon, 1. - epsilon)
ce = - np.mean(np.log(predictions) * targets)
return ce
El siguiente código se usará para verificar si la funcióncross_entropy
son correctos
predictions = np.array([[0.25,0.25,0.25,0.25],
[0.01,0.01,0.01,0.96]])
targets = np.array([[0,0,0,1],
[0,0,0,1]])
ans = 0.71355817782 #Correct answer
x = cross_entropy(predictions, targets)
print(np.isclose(x,ans))
La salida de los códigos anteriores es False, es decir, mis códigos para definir la funcióncross_entropy
no es correcto. Luego imprimo el resultado decross_entropy(predictions, targets)
. Lo dio0.178389544455
y el resultado correcto debería serans = 0.71355817782
. ¿Alguien podría ayudarme a verificar cuál es el problema con mis códigos?