Чтобы сделать случай простым и интуитивно понятным, я буду использовать двоичную (0 и 1) классификацию для иллюстрации.
Функция потери
loss = np.multiply(np.log(predY), Y) + np.multiply((1 - Y), np.log(1 - predY)) #cross entropy
cost = -np.sum(loss)/m #num of examples in batch is m
Вероятность Y
predY
вычисляется с использованием сигмоида, и logits
может рассматриваться как результат от нейронной сети до достижения этапа классификации
predY = sigmoid(logits) #binary case
def sigmoid(X):
return 1/(1 + np.exp(-X))
Задача
Предположим, у нас есть прямая сеть.
Входные данные: [3, 5]: 3 - это число примеров, а 5 - размер объекта (изготовленные данные)
Количество скрытых юнитов: 100 (только 1 скрытый слой)
итераций: 10000
Такое расположение подходит для снаряжения. Когда это подходит, мы можем точно предсказать вероятность для обучающих примеров; другими словами, сигмоид выводит 1 или 0, точное число, потому что экспонента взорвана. Если это так, у нас будет np.log(0)
undefined . Как вы обычно решаете эту проблему?