Я пытаюсь сделать программу распознавания цифр. Я буду питать белое/черное изображение цифры, и мой выходной слой будет стрелять соответствующей цифрой (один нейрон должен стрелять из 0 -> 9 нейронов в выходном слое). Я закончил внедрение двухмерной сети нейронов BackPropagation. Модные размеры топологии [5] [3] -> [3] [3] ->1 [10]. Таким образом, это один двумерный входной слой, один двумерный скрытый слой и один одномерный выходной слой. Однако я получаю странные и неправильные результаты (средняя ошибка и выходные значения).BackPropagation Neuron Network Approach - Design
Отладка на данном этапе отнимает много времени. Поэтому я хотел бы услышать, если это правильный дизайн, поэтому я продолжаю отладку. Вот шаги потока моей реализации:
построения сети: Один Bias на каждом уровне за исключением выходного слоя (без смещения). Выходное значение Bias всегда равно 1.0, однако его веса соединений обновляются на каждом проходе, как и все другие нейроны в сети. Все весовые коэффициенты 0.000 -> 1.000 (без отрицательных эффектов)
Получить входные данные (0 | ИЛИ | 1) и установить n-е значение в качестве n-го значения выходного сигнала нейрона во входном слое.
упреждения: На каждый нейрон «п» в каждом слое (за исключением входного слоя):
- Получить результат SUM (Output Value * Подключение веса) связного Нейроны из предыдущего слоя в этом направлении nth Neuron.
- Получить TanHyperbolic - передаточная функция - этой суммы в качестве результатов
- Набор результатов в качестве выходного значения этого п-й Neuron
Получить результаты: Возьмите выходные значения нейронов в выходном слое
обратного распространения:
- Вычислить Ошибка сети: на выходном слое, получить SUM Нейроны (Целевые значения - выходные значения)^2. Разделите этот SUM на размер выходного слоя. Получите его SquareRoot в качестве результата. Вычислить среднюю ошибку = (OldAverageError * SmoothingFactor * Result)/(SmoothingFactor + 1.00)
- Расчет градиентов выходного уровня: для каждого выходного нейрона 'n', nth Gradient = (nth Target Value - nth Output Value) * nth Output Value TanHyperbolic Производные
- Рассчитайте градиенты скрытого слоя: для каждого Нейрона 'n' получите SUM (TanHyperbolic Derivative от веса, идущего от этого n-го Нейрона * Градиент места назначения Neuron) в качестве результатов. Назначьте (результаты * это n-ые выходные значения) в качестве градиента.
- Обновить все веса: Начиная с скрытого слоя и обратно на входной слой, для n-го нейрона: вычислить NewDeltaWeight = (NetLearningRate * nth Output Value * nth Gradient + Momentum * OldDeltaWeight). Затем назначьте новый вес как (OldWeight + NewDeltaWeight)
- Повторите процесс.
Вот моя попытка для цифры номер семь. Выходы - Neuron # zero и Neuron № 6. Нейрон шесть должен иметь 1 и Neuron # ноль должен переносить 0. В моих результатах все Neuron, кроме шести, имеют одинаковое значение (# zero - образец).
Извините за длинный пост. Если вы это знаете, вы, вероятно, знаете, насколько он крут и насколько он должен быть в одном посте. Заранее спасибо
Обычно Softmax с логарифмической потерей обычно используется для активации многоклассового уровня. Для меня это не ясно, если вы делаете двоичный или многоклассовый вывод. – javadba
Я новичок. Я не знаю значения двоичного и многоклассового уровня вывода. Я представил свою цель этого проекта в первом абзаце. Пожалуйста, прочитайте его и сообщите о любых отзывах. Цените это и спасибо –
Конечно. У вас многоклассовый/многочленный: с 10 возможными цифрами, включающими 10 классов. Поэтому вы можете попробовать изменить функцию активации уровня вывода на softmax https://en.wikipedia.org/wiki/Softmax_function. Дайте нам знать, какой эффект это имеет. – javadba