Функция перекрестной энтропии (python)

я изучаю нейронную сеть, и я хочу написать функцию cross_entropy в python. Где он определяется как

cross entropy

здесь N - число образцов, k это количество классов,log - это натуральный логарифм, t_i,j 1, Если образец i в классе j и 0 в противном случае, и p_i,j это предсказанная вероятность того, что образец i в классе j. Чтобы избежать числовых проблемы с логарифмом, клип Прогнозы на

1 ответов


вы не так уж далеко, но помните, что вы берете среднее значение N сумм, где N = 2 (в данном случае). Чтобы ваш код мог читать:

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)
    N = predictions.shape[0]
    ce = -np.sum(targets*np.log(predictions+1e-9))/N
    return ce

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))

здесь, я думаю, это немного яснее, если вы придерживаетесь np.sum(). Кроме того, я добавил 1e-9 в np.log() чтобы избежать возможности наличия журнала (0) в ваших вычислениях. Надеюсь, это поможет!