2016-11-26 2 views
1

Im выполняет задачу нейронной сети с функцией активации Sigmoid. Мой вход в сеть - это изображение (MNIST) и потому, что размер каждого изображения равен 28*28. Когда мне нужно преобразовать их в вектор, у меня будет N*784. Умножение этой большой матрицы с весовой матрицей дает большие положительные и отрицательные числа для весов, и я должен передать их функции Sigmoid. Я использую expit() как сигмоидную функцию, и моя проблема в том, что:Функция сигмоида для больших чисел в Python

номера до 30, полученные вблизи 1 в expit(). например expit(28) Результаты 0.99999999 и expit(29) Результаты 1.0 и верхние 29 также получает 1. Но мои новые манеры - верхние 30, и из-за этого некоторые из них получают 1 и некоторые 0 в первом цикле обучения, и на самом деле никакого обучения вообще нет.

Что мне нужно делать? Sigmoid's верхняя граница 29? Я не могу изменить его? Мне нужно изменить измерение изображения, чтобы преодолеть это?

+0

В какой версии на scipy вы используете? expit был численно неустойчивым до 0,14 (https://github.com/scipy/scipy/issues/3385) –

+0

Я не знаю, два дня назад я установил его через pip. – Fcoder

+0

проверить с помощью python -c 'import scipy; print (scipy .__ version__) «Я предполагаю, что вы используете выкуп Scipy, не так ли? –

ответ

1

Как обсуждалось в разделе комментариев, реальная проблема оказалась сама по себе использованием sigmoid, что не подходит для таких случаев. При любых вычислениях с конечной точностью вы столкнетесь с описанной проблемой, с одной системой с 29, с другой с 38.

Одним из способов решения проблемы является использование функции активации softmax, которая менее подвержена таким проблемам. Помните, что с функцией стоимости вы можете столкнуться с аналогичными проблемами.

Немного не по теме, вы можете проверить, как проблема устранена, например. tensorflow. У него есть несколько полезных уроков для начинающих.