Открыть список
Как стать автором
Обновить

Комментарии 29

Браво! Было очень интересно почитать! Спасибо.
только название топика переименуй, а то «не» как-то неинформативно смотрится.
для вашего примера банальное попиксильное сравнение работало бы куда быстрее 13 секунд :)
Или векторный квантователь… что по сути одно и то же)
Сеть Хопфилда хороша не как техническое решение, а как новый подход к нейросетям вообще. Скажем, ядерная (kernel) ассоциативная память, которая является пракически прямой наследницей сети Хопфилда, умеет запоминать уже произвольное число образов (с автоматическим ростом сети), умеет обобщать разные примеры в один образ, и обладает множеством других приятных свойств (например, работает, при малом числе запомненных образов, заметно быстрее).
Так что для практических применений лучше брать не концептуальные работы 30-летней давности, а свежие результаты :) Ну и как всегда с нейросетями, применять их в лоб, на неподготовленных данных, категорически не рекомендуется.
И вы уж простите, но за наличие след. названий ф-ций надо как минимум давать по рукам:
Neyron
ChangeSost
Inicialise
FindObraz
FindObraz, %username%!
Я тоже занимался НС, и именно Хопфилда и Хэмминга, и именно для задачи распознавания образа; только распознавалось у меня авторство, а не рисунок, но это не суть важно. Спасибо, что еще раз напомнили, как оно все действует.

(Кстати, документ, по которому я изучал нейросеть, практически полностью совпадает с вашим постом, за исключением вашей интерпретации, но это мы, пожалуй, простим).

Ну, поскольку вы привели код, поговорим о коде. Мне ваша реализация нейросети чем-то не нравится.

Мнемоники смешиваются: ChangeSost, FindObraz… Я, например, терпеть этого не могу. Должны быть: ChangeState, FindImage и т.п.
Количество элементов фиксировано:
private const int size = 10000;

mass = new Neyron[size];
new int[size, size];

А что нам делать, если картинка других размеров? Если это вообще не картинка, а иного типа образ? Количество нейронов сильно зависит от типа данных, который мы в сеть загружаем. В общем, без динамических контейнеров в нейросетях жить будет туго.
Еще плохо то, что в коде нет delete. Или вы скажете, что Шарпе был какой-то там сборщик мусора, я точно не знаю, язык не изучал, так что поверим и простим.
matrix_of_connect вообще-то называется матрицей весов, если не ошибаюсь, то есть, weightMatrix или weights было бы очевиднее.

А вообще, честно признаюсь, что и сам написал очень неудачную реализацию НС Хэмминга. Было это три года назад, когда я многого в программировании не знал.

>реализацию НС Хэмминга.
Эээ, Хопфилда, конечно. И Хэмминга тоже.
Спасибо за развернутую критику и подробное указание на проблемы именования в коде=) Основной код был написан 2 года назад на 2 курсе, а я что-то не придал этому внимания, сейчас поправлю;)

Получилось прямо как в анекдоте, эта статья не должна была публиковаться, видимо была глубокая ночь, и я по классике жанра вместо «Просмотра» кликнул «Опубликовать» ) Попробую привести к приемлемому виду=)
Имена функций и класса доставили
Что вы пристали к человеку, по поводу сложности задачи представленной им, ну не учебник же Хайкина сюда печатать, он дал начало, так сказать для размышления.
А по поводу наименований функций, действительно надо дать по рукам.
НЛО прилетело и опубликовало эту надпись здесь
Ну вот предположим исходные образы те же, а попытаемся восстановить:
image
То сеть успешно «говорит» что это
image
Тут главное чтобы именно исходные образцы не были слишком похожи.
Вот если нарисовать по разному глаза, и при восстановление полностью убрать улыбку, то сеть будет пытаться восстановить именно по имеющимся различиям в образцах
НЛО прилетело и опубликовало эту надпись здесь
мои нейроны тоже не смогли однозначно определить что это ;)
Программа поможет эффективно взамывать капчи
Да, только прежде её нужно также эффективно обучить.
В свое время тоже писа сеть хопфилда. Но у вас я вижу поиск только последовательным итерациями. Еще можно добавить случайную выборку изменяющегося нейрона (также выбирать до стабилизации сети) и паралелльную обработку (меняем сначала состояния всех нейронов, потом уже меняем их выходы). Плюс неплохо бы добавить инвертацию изображения, это тоже иногда помогает.
Плюс необходимо учитывать что сеть может зациклиться и продумать механизм поиска данной ситуации (если в двух словах, то можно смело выходить когда на полной итерации по всем нейронам не было изменено ни одного нейрона, но от зацикливания это не поможет. Если в лоб, то можно хранить все итерации и с ними сравнивать. Если идти эмперически, то можно выяснить, что количество полных итераций в наихудшем варианте распзнавания будет где-то около количества нейронов, сейчас точно не помню как вычислял).
И еще мой совет убрать рекурсию. А то итераций может быть дофига (особенно при зацикливании сети), а стек не резиновый.
Да, действительно поиск может зациклиться из-за невозможности восстановить образ и при этом стек вызова переполнится. Но я намеренно упростил алгоритм, сделал рекурсию и не стал параллелить, чтобы сосредоточить внимание читателя именно на идеи=)

Ваши комментарии насчет оптимизации и обходу «узких мест» меня заинтересовали, особенно про так называемые «зацикливания», я просто как не старался не смог от этого избавиться.

Ну и конечно при моем последовательном переборе требуется много ресурсов=) Я экспериментировал с картинками 400Х400, так там уже требуется около минуты ждать.
Была идея как-то группировать пиксели при больших разрешениях, что бы требовалось меньше нейронов, но я так ее и не развил.
могу выслать исходники, но сразу говорю делалось в качестве курсача, поэтому там жестко прошиты ограничения изображений 16х16, но сама идея я думаю должна быть понятна. Писалось на ruby/Qt4.
емейл свой в личку напишите
Так Вы лучше выложите куд-нибудь, и ссылку здесь дайте, мне бы тоже было интересно посмотреть, да и мало ли кому еще.
куда?) на гуглокод смысла нет, ибо проект мертвый и что-то с ним делать не планируется. А во всякие пасти не получится, там не один файл.
Зажмите в архив, и на дропбокс, например, или на какой другой файлообменник.
>приклодным
Что то в туалет захотелось
В следующий раз картинки сохраняйте в формате без потерь png, например, а не jpg.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.