Есть ли лучшая функция активации для моей нейронной сети? - PullRequest
0 голосов
/ 01 мая 2018

Я пишу программу для распознавания рукописных букв. У меня есть изображения размером 500px * 500px, которые я импортирую как BufferedImages, и я принимаю значение getRBG () каждого пикселя в качестве входных данных для нейронной сети, поэтому существует 250 000 входных данных. Значения для getRGB () варьируются от -16777216 (обозначает запись) до -1 (обозначает белый фон). Веса от входа до первого скрытого узла рандомизированы от 0 до 1. Я использовал сигмовидную функцию 1/(1+e^(-x)) в качестве моей функции активации, чтобы получить все значения от 0 до 1. Однако моя проблема заключается в том, что с Есть так много входов, когда я беру их точечное произведение с весами, я получаю число с огромной величиной (например, 1.3E8 или -1.3E8). Затем, когда я помещаю это число в сигмоидную функцию, результаты всегда равны 1 или 0, поэтому, по сути, она не передает никакой ценной информации второму скрытому узлу. Кроме того, поскольку изображения преимущественно белые, большинство входных данных - -1.

Я настроил код так, чтобы он печатал значения после точечного произведения, а затем печатал его после прохождения через сигмовидную функцию.

After dot product with weights, before sigmoid function: 
-1.3376484582733577E8   
-1.3382651127917042E8   
-1.3438475698429278E8   
-1.3356711106666781E8   
-1.3470225249402404E8   
-1.3372922925798771E8   
-1.3211961536262843E8   
-1.3512040351863045E8   

After sigmoid function: 
0.0 
0.0 
0.0 
0.0 
0.0 
0.0 
0.0 
0.0 

Для редактирования значений getRGB () я использовал функцию newRGBValue = (getRGB() + 2) * (-1), поэтому все значения варьировались от -1 до 16777214. Однако, когда я передаю все эти значения в сигмоидную функцию, она просто возвращает 1, так как новый Точечное произведение с этими значениями - это огромные положительные числа (показано на выходе ниже).

After dot product, before sigmoid function: 
1.3198725189415371E8    
1.3345978405544662E8    
1.3375036029244222E8    
1.3278472449389385E8    
1.328751157809899E8 
1.3309195657860701E8    
1.34090008925348E8  
1.3300517803640646E8

After: 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0

Есть ли лучшая функция активации, которую я должен использовать для этой программы? Или есть способ, которым я могу манипулировать входами, чтобы сигмоидальная функция подходила? Извините за этот скучный пост и заранее благодарим за понимание.

1 Ответ

0 голосов
/ 01 мая 2018

Нормализуйте ваши входы. То есть для каждого изображения вычислите среднее значение mu и дисперсию sigma значений пикселей и замените старое значение пикселей v на нормализованное значение (v - mu) / sigma. Это устраняет огромные отрицательные значения, которые вы имели для ваших значений пикселей.

Также рассмотрите возможность использования нормально распределенных начальных случайных весов со средним значением 0 и дисперсией 1, чтобы ожидаемое значение ваших точечных произведений равнялось 0. Тогда было бы лучше переключиться на функцию активации tanh, которая центрирована в 0 следовательно, приводит к более быстрому обучению (если ваши точечные продукты близки к 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...