В образовательных целях я уже некоторое время создаю библиотеку глубокого обучения. Несколько дней go Я получил задание на стажировку для создания модели с нуля, используя numpy, которая будет классифицировать цифры из подмножества набора данных MNIST на 2 класса (0 - нечетное, 1 - простое). Все шло хорошо, пока не пришло время создавать функцию потерь. Поскольку это проблема двоичной классификации, я выбрал бинарную кроссентропию. Есть реализация:
def loss(self, target: np.ndarray, predicted: np.ndarray, epsilon=1e-7) -> np.ndarray:
predicted = np.clip(predicted, epsilon, 1 - epsilon)
predicted = np.log(predicted / (1 - predicted))
return (target * -np.log(self.sigmoid(predicted)) +
(1 - target) * -np.log(1 - self.sigmoid(predicted)))
По сути это почти та же функция, что и у keras для numpy бэкэнда. Вывод этой функции потерь с размером партии 16 выглядит следующим образом:
[[1.61180957e+01]
[1.00000005e-07]
[1.00000005e-07]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.00000005e-07]]
У меня есть серьезные сомнения, что они не должны выглядеть так. Возможно, это проблема с набором данных, который нам пришлось самостоятельно реорганизовать. Для пояснения типичный пример - просто матрица значений 28x28 пикселей, а метка - просто одно число 0 или 1. Следующая проблема возникает, когда я пытаюсь суммировать потери за целую эпоху и сохранять их в чем-то похожем на объект истории Keras. Нужно ли мне подводить итоги потерь за каждую итерацию партии, а затем делить ее на количество выборок (что звучит неправильно для меня) или нужно правильно рассчитывать потери эпохи?
Спасибо за помощь заранее и оставайтесь в безопасности и здоровы!