Неудачно инициализирующиеся случайные веса простой нейросети
Есть некоторая функция распознавания изображений, использующая в этих целях нейросеть. Для ясности: она принимает объект А, объект Б и неопределенный объект. Ее задача определить: третий А или Б? Тренировочные данные - известные объекты. Пока что опустим этот момент.
Подробней о процессе тренировки этой нейросети. Существуют такие случайне инициализации весов, при которых нейросеть не тренируется. То есть ошибка распознавания на втором слое остается в пределах 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
- Уже пытался решить (жалкая попытка) изменением numpy.random.seed(на_случайное_число) по времени работы программы (не превышало 100, не повторялось, менялось каждые 10 неудачных обучений).
- Уже пытался повторить 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)

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