Неудачно инициализирующиеся случайные веса простой нейросети

Есть некоторая функция распознавания изображений, использующая в этих целях нейросеть. Для ясности: она принимает объект А, объект Б и неопределенный объект. Ее задача определить: третий А или Б? Тренировочные данные - известные объекты. Пока что опустим этот момент.

Подробней о процессе тренировки этой нейросети. Существуют такие случайне инициализации весов, при которых нейросеть не тренируется. То есть ошибка распознавания на втором слое остается в пределах 0.5 +- 0.05 или 0.25 +- 0.05.

Эти случаи я определяю в самом процессе тренировки: если на больших повторах ошибка больше порога, то повторяем весь процесс обучения с момента инициализации весов. То есть пытаемся с новыми весами.

Все бы ничего, но термиты проедают деревянный костыль этого простуженного кода. Онная функция вызывается тучу раз. Процесс тренировки занимает, скажем, приемлемые 2 секунды. Это с учетом 1 повтра обучения. А этих самых повторов может быть разно как! Хоть 2, 10, 18, 25. Что хочешь... Терпимо. Не это причина моего вопроса. Я столкнулся с следующим: безрезультатные 400+ повторов. Каждый раз весы неудачно инициализировались. Нейросеть не могла преодолеть этот рубикон порога ошибки. Во всех повторах ошибка колебалась в обозначеных ранее пределах.

О случайной инициализации и самой нейросети. Нейросеть взята из этой статьи. Как и нейросеть, сама функция сильно адаптирована под конкретную задачу. Привести полный код будет достаточно затруднительно. Поэтому оставляю статью. Можете смело листать в конец. Код моей неросети практически не отличается.

Сама инициализация весов:

in_connections =numpy.prod(объект_а.shape)
out_connections=2#  так как у нас два изображения в тренировочных данных. На самом деле у меня их больше.
syn0=2 * numpy.random.random((in_connections, out_connections)) - 1
syn1=2 * numpy.random.random((out_connections, 1)) - 1
  1. Уже пытался решить (жалкая попытка) изменением numpy.random.seed(на_случайное_число) по времени работы программы (не превышало 100, не повторялось, менялось каждые 10 неудачных обучений).
  2. Уже пытался повторить 400+ безрезультатиков на отдельно вынесеном тесте. То есть я взял плохих парней (сами данные, при которых происходит онная проблема) и в отдельном тестике не смог повторить проблему с 51 попытки. Рекорд менее 90. Тест был в два тира: с и без первого пункта.

Возможно это лишнее, но у плохих парней 4 изображения с выходом 1 и 3 изображения с выходом 0.

Воот.. Этот костыль можно сделать железным? Может можно оценить насколько хорошо инициализированы веса и тем самым убрать 1000+ циклов заведомо плохого обучения? Или все же есть лекарство? Даже догадок о нем нету, но не будет код ни болеть, ни быть инвалидомx).


Ответы (2 шт):

Автор решения: Константин

Смотрите,сделал такую сеть (2,3,1),тренировалась на логическом ИЛИ,есть кросс валидация,инициализация весов по Хе,активация Relu и вот при данных параметрах - 100% кросс валидация: топология: именно (2,3,1) learning rate - 0.07 np.random.seed(42) - если изменишь на 40 - уже 25%

Я думаю надо делать адаптивный learning_rate . Я визуализировал с помощью Pillow в своей топологии сети для слоя с входами==2,где seed(42) seed(42)

И с seed(40): seed(40)

Видно в первой они более равномерно распределены(по Гауссу(по Хе))

→ Ссылка
Автор решения: Константин

Я доработал программу,теперь выдает значение положительных чисел как серых.Картинки вторая с зерном 42 показывает(кроме того,что описал выше),что положительные числа близки к нулю(еле серы),первая при зерне 30 все не так(далековаты от 0). 1 2

→ Ссылка