Я пытаюсь сделать категориальную функцию потери перекрестной энтропии, чтобы лучше понять интуицию, стоящую за ней. Пока моя реализация выглядит так:
# Observations
y_true = np.array([[0, 1, 0], [0, 0, 1]])
y_pred = np.array([[0.05, 0.95, 0.05], [0.1, 0.8, 0.1]])
# Loss calculations
def categorical_loss():
loss1 = -(0.0 * np.log(0.05) + 1.0 * np.log(0.95) + 0 * np.log(0.05))
loss2 = -(0.0 * np.log(0.1) + 0.0 * np.log(0.8) + 1.0 * np.log(0.1))
loss = (loss1 + loss2) / 2 # divided by 2 because y_true and y_pred have 2 observations and 3 classes
return loss
# Show loss
print(categorical_loss()) # 1.176939193690798
Однако я не понимаю, как должна вести себя функция, чтобы возвращать правильное значение, когда:
- хотя бы одно число из
y_pred
равно0
или1
, потому что тогда функцияlog
возвращает-inf
или0
и как в этом случае должна выглядеть реализация кода - по крайней мере одно число из
y_true
равно0
, потому что умножение на0
всегда возвращает0
и значениеnp.log(0.95)
тогда будет отброшено, и как должна выглядеть реализация кода в этом случае