Как суммировать и интерпретировать потерю эпох при использовании бинарной кроссентропии? - PullRequest
0 голосов
/ 10 апреля 2020

В образовательных целях я уже некоторое время создаю библиотеку глубокого обучения. Несколько дней 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. Нужно ли мне подводить итоги потерь за каждую итерацию партии, а затем делить ее на количество выборок (что звучит неправильно для меня) или нужно правильно рассчитывать потери эпохи?

Спасибо за помощь заранее и оставайтесь в безопасности и здоровы!

1 Ответ

0 голосов
/ 10 апреля 2020

Я полагаю, что ваш текущий вывод предназначен для мини-пакета, в противном случае ваш «прогноз» должен быть одним значением, а не ndarray.

Кроме того, что вы подразумеваете под потерей эпохи? Вы должны вычислять потери для каждой мини-партии, которые являются средней потерей, как описано.

...