Pull to refresh

Comments 11

Еще одинтуториал из серии "как нарисовать сову".
Раз уж вы об этом упомянули, то не хотите ли показать, как данная нейросеть рукописный текст распознает?

Вопрос: Как создать нейросеть всего из 30 строк JavaScript-кода


Ответ: использовать готовую библиотеку и не считать её строки кода

на выходе я получил 0 или 1
а дальше что?
дал ей рукописные каляки маляки, она выдала мне выдала текст. как?
как 0 или 1 даст мне тот самый текст
Не уместилось в 30 строк)

Вторая часть, наверное, будет:
Как использовать то, что получили из нейросети, созданной из 30 строк на js, за 30 строк Javascript кода
Запихав 20000 раз всю таблицу решений для всех возможных входных сигналов мы получили почти точное (точное после округления) решение для тех же входных сигналов.
Можно что-то более приближенное к реальности? Чтобы сеть искала ответ для того, что мы в неё еще не запихивали?
— Я напишу сеть за одну строку кода
— Пишите
— start ainetwork.exe
Synaptic не лучшая реализация:
— структура в виде отдельных нейронов. Гораздо удобнее рассматривать сеть слоями, отдельные нейроны не нужны. А если мы храним слоями, то удобнее веса хранить в матрицах. А если мы хотим сверточную, то на входе данные 3х мерный массив (x, y, rgb_channel), а это уже тензор. В архитектуру библиотеки заложено, что на входе вектор.
— backpropagate.
— В принципе все хорошо. Но каждый вызов этого механизма заставляет сеть обновить веса. А где же концепция батчей? Сеть должна уметь накапливать градиент для нескольких примеров которым учится, а потом перенастраивать веса. Нет, synaptic этого не умеет. В более современных реализациях бэкпроп и градиент хранит обучающий агент, то есть не сеть делает обратное распределение ошибки, а учитель, но я думаю это уже избыточно.
— При расчете градиента не умножается на производную от функции активации. Я писал реализацию backpropagate на JS читая medium.com/@14prakash/back-propagation-is-very-simple-who-made-it-complicated-97b794c97e5c, потом написал учителя для XOR который будет работать и с моей реализацией и с Synaptic. Оказалось, что у меня нужно раз в 5 больше итераций. Убрал умножение на производную функции активации и результаты совпали. Я не могу обосновать что это умножение нужно, но так написано во всех описаниях метода.

Моя черновая реализация на JS: github.com/Apache02/node-yann
Работает медленнее. В Synaptic круто используются оптимизации.
То, что вы называете «уровни», традиционно в русском переводе называется «слои» (отсюда, например, термин «многослойный перцептрон»).
Также, то, что в переводе названо «бацесовым значением», не имеет отношения к Байесу и обычно по аналогии с линейной регрессией называется «сдвигом», «смещением» или «константой». Или просто не переводится.
Спасибо за пример. Но каким образом сохранить результат обучения? Если, к примеру, взяться за более длительный процесс обучения не хочется при каждом запуске кода его повторять.
Sign up to leave a comment.