Распознает стандартную капчу вакабы с довольно сильными искажениями. Работает только если большинство букв не пересекаются на картинке.
Делал примерно неделю, для изучения тонкостей работы сверточных нейронных сетей. Получилось в принципе неплохо, на уныле точность близка к 100%. Пришел к выводу, что изначально выбрал не очень удачную стратегию с отдельными этапами сегментации и распознавания. Чтобы значительно повысить точность на более сложных примерах, где буквы сливаются, нужно как-то одновременно сегментировать и распознавать. Текущий метод для этого не годится. Тем не менее я добился цели, которую изначально ставил.
Отвечу на вопросы, да и просто можно обсудить нейронные сети, распознавание и близкие темы.
>>437732 Там писать не о чем, я применил давно известные технологии. Только в целях обучения интересно. Такой тип НС (LeNet-5) использовался для распознавания рукописных цифр с 90-х годов.
Но если в 90-х для тренировки сети нужен был суперкомпьютер, то сейчас это занимает у меня полчаса на ноуте, лол.
>>437745 Рекомендую очень хороший курс машинного обучения на курсере: https://www.coursera.org/course/ml Понадобятся базовые знания матана и линейной алгебры. Там объясняются основные алгоритмы, идеи, даются рекомендации по практическому применению. 10/10.
Для выработки практических навыков можно попробовать поучаствовать в соревнованиях на http://www.kaggle.com/ . Чтобы что-то выиграть там надо быть очень, очень крутым, но для тренировки он тоже хорош. Заодно и видишь, куда тебе стремиться, лал.
Ну а конкретно за глубоким обучением - на http://deeplearning.net/ . Это продвинутый уровень уже. Этот проект сделан на модифицированном туториале оттуда.
Сначала буквы отделяются друг от друга простым анализом связных компонент. При этом если буква получается очень широкой, я также пробую разбить ее на две, помогает от склеившихся букв как на пике.
Дальше работает алгоритм, который идет по грамматике капчи вакабы и выбирает наиболее вероятный путь при данных вероятностях отдельных символов. Это не очень просто, т.к. может быть несколько путей генерации одного и того же слова. Приходится запоминать несколько наиболее вероятных путей. Сложно так на словах объяснить алгоритм, легче посмотреть в коде. Ну и на выходе выбирается самый вероятный путь.
Это все повторяется несколько раз с использованием разных параметров разбиения склеившихся букв и выбирается самый вероятный результат.
>>437884 Таких сервисов есть несколько, где людям деньги платят за вбивание капчи. Мне кажется, дела у них плохи - экономически невыгодно. Вбивание капчи не приносит достаточно профита, чтобы оплатить человеку услугу ее распознавания.
>>437993 Вот у этого чувака 1% вроде: http://geektimes.ru/post/64535/ Правда, там сплошной discover imageshack, и непонятно, точно такая же это капча или что-то поменялось уже.
У него простой подход, так что можно попытаться улучшить с использованием "новых" технологий, которые я применил для вакабы. Удастся ли дожать до 50% можно узнать только проделав всю работу.
>>438062 Да, сделать гораздо быстрее его можно. Но сейчас распознавание занимает 0.05с, это быстрее, чем капча генерируется и передается, так что я не стал морочиться.
>КАК МНЕ ПОВЫСИТЬ РАЗРЕШАЮЩУЮ СПОСОБНОСТЬ И СПОСОБНОСТЬ К РАСПОЗНОВАНИЮ? Ну разрешение повысить элементарно, надо просто сеть побольше сделать. Естественно, пропорционально возрастет и количество весов и время/сложность тренировки.
Вот способность к распознаванию повышать нетривиально. Именно в этой капче я бы начал с сегментации. Сейчас там дубово сделано, это часто фейлится. Нужно сделать сегментацию тоже на НС. Т.е. одна НС тренируется, чтобы определять границы между символами, а вторая распознает сами символы. Потенциально это может быть точнее, но работы много.
Если рассматривать более сложные капчи, как яндексовскую, то там LeNet5, боюсь, может уже не справиться. Нужно будет пробовать более хардкорные штуки с пре-тренировкой из асенала глубокого обучения. Опять же рекомендую на эту тему посмотреть туториал с http://deeplearning.net/ , там расписаны многие алгоритмы.
Если тебя интересует прям совсем передний край науки, посмотри http://arxiv.org/abs/1502.01852 и то, на что они ссылаются. Эти сети распознают картинки лучше людей.
Пикча: активации на двух сверточных слоях на нескольких примерах.
>>438092 >Да, сделать гораздо быстрее его можно. Но сейчас распознавание занимает 0.05с, это быстрее, чем капча генерируется и передается, так что я не стал морочиться. НО КРОМЕ ЕТОЙ КАПЧИ ЕСТЬ МНОГО РАЗНЫХ ПОСЛОЖНЕЕ НЕ ДУМАЮ ЧТО ХВАТИТ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ 1ГО СЛОЯ ДЛЯ ИХ РАСПОЗНАНИЯ
>>438092 >Нужно сделать сегментацию тоже на НС. Т.е. одна НС тренируется, чтобы определять границы между символами, а вторая распознает сами символы. Потенциально это может быть точнее, но работы много. А НАСЧЕТ СЕГМЕНТАЦИИ У МЕНЯ ЕСТЬ ХОРОШИЕ ИДЕИ
А хуле толку? На хабре уже кто-то статью писал о том же, там всё пошагово. Ты вот тоже прошёл туториал, молодец. Но хуле с этого толку? Кому это нужно?
>>438302 Разрешение входной картинки не так уж принципиально на самом деле. Примерно 25x25 должно быть достаточно. Цифры капчи яндекса, например, если уменьшить их до такого размера, вполне читаемы. Может, какой-то супер метод и может дополнительную информацию извлечь из большего разрешения, но мне пока до этого далеко.
>>438303 Расскажи, можем обсудить это, если интересно.
>>438312 Код тренировщика публиковать не собираюсь. Там все слишком сумбурно и не реюзабельно. Если ты хочешь натренировать другой классификатор, лучше пиши сам - это очень полезно для обучения. Там много тонкостей. Я этим как раз занялся, чтобы лучше понять, как это все работает.
Не понимаю пользы этого говна, если честно. Все что могут подобные поделки - научить некую сущность написанную на чистом говнокоде распознавать однотипные картинки.
То есть ты им подсовываешь картинки с заранее известным результатом и модерируешь через обратную связь весовые коэфициенты.
В чем польза? Твоя прога сможет распознать баннер тематической доски двача? Нет? Тогда нахуй не надо. Это все говнокодерство и поделки уровня Алексея Бабушкина.
>>439580 что тебе нужно, там вполне нормальный/читаемый код, кстати, лучше чем у 70% быдло-джава энтерпрайз погроммистов. Разве что именования иногда говнистые и не джавовский naming convention
Ну и человек самостоятельно реализовал сверточную нейронную сеть, поделился кодом с общественностью, а не взял готовое говно из какой-нибудь Weka, даже не понимая как оно устроено.
Теперь осталось освоить OpenCV, для быстрого прототипирования перейти на Scientific Python (numpy scipy, scikit-learn, ipython notebook), немного поиграться на kaggle и можно начинать работать не быдло-макакой, а белым человеком.
>>439738 Попробую объяснить это немного подробнее.
Слово для капчи в вакабе генерируется с помощью грамматики. На каждом разветвлении при раскрытии нетерминала выбирается случайная ветка, с равной вероятностью. Таким образом мы имеем априорное распределение вероятностей на множестве всех слов, причем подавляющее большинство последовательностей букв имеют нулевую вероятность, т.к. не допускаются грамматикой. Это можно использовать для коррекции побуквенного распознавания. Простой пример: пусть классификатор назначил такие вероятности для первых двух букв: q=0.9, o=0.1 для первой и v=0.99, u=0.01 для второй. Наивный побуквенный алгоритм выбрал бы самые вероятные буквы, получив qv. Но это недопустимая последовательность по грамматике. Алгоритм, который это учитывает, выберет ov, вероятность которого выше.
Чтобы абсолютно точно расчитать апостериорную вероятность, нужно перебрать все возможные цепочки, допустимые в грамматике, и оценить вероятность каждой. Но их огромное количество, поэтому я обрезаю перебор, когда вероятности становятся слишком маленькими. Т.к. путей для генерации одной и той же цепочки может быть несколько, приходится запоминать вероятности уже пройденных цепочек, и обновлять их при повторном их прохождении. Для этого у меня строится дерево возможных цепочек с их вероятностями. Оно тоже обрезается, чтобы не сильно разросталось.
Надеюсь, стало понятнее.
>>439749 Классификатор натренирован именно на теано. Но тянуть его в конечный продукт не имеет смысла: у него сотни мегабайт зависимостей, в т.ч. gcc, питон, многочисленные пакеты для него. Это никто не будет устанавливать, кроме энтузиастов машинного обучения. В то же время в рантайме нужно всего лишь пару простейших операций определить.
>>440083 В одной норвежской конторе. Занимаюсь анализом данных. Шел к этому очень долго. Суть можно описать как "постепенное углубление специализации". ЗП для Норвегии так себе, элитные кодеры гребут в разы больше. Мне хватает.
Оп, я так понимаю, выбор именно сверточной сети для того, чтобы распознавать буквы независимо от их поворота и т.п.? Для этой задачи разве не лучше подойдет растущий нейронный газ http://www.sciencedirect.com/science/article/pii/S0925231213009259 или карты Кохонена?
>>440925 Я не очень понял, как карты Кохонена могут помочь с распознаванием независимо от трансформаций. Не видел статей на эту тему. Можешь пояснить?
Про растущий нейронный газ я почти ничего не знаю.
А сверточные сети давно себя зарекомендовали на этом поприще. К тому же в данном случае мне было интересно попробовать новомодное глубокое обучение в деле, поэтому такой выбор.
поясните что из себя представляет этот набор ImageNet? Есть изображение которое нужно распознать, так? Для его распознавания сеть дрессируют на неком материале - это тоже картинки. К тренировочным картинкам добавлены какие-то смысловые тэги? Которые потом вероятностно назначаются при рассмотрении главной картинки? На каком этапе происходит увязка содержимого изображения с текстовым стрингом?
Задача НС - угадать слово, сопоставленное с картинкой. Маленьким детям такую задачу тоже ставят часто. В работе, о которой идет речь, выбрана 1000 категорий. НС принимает на вход картинку, на выходе - вероятность каждой из 1000 категорий для этой картинки.
>>437727 Еще бы кто-то объяснил как в сверточных сетях делать настройку весов. И вообще, что лучше использовать массивы или списки для хранения нейронов. А вообще было бы неплохо блок-схему, чтобы окончательно всем стало все понятно.
>>437727 А вообще лучше даже словами описать. Типа 1. Есть двумерный массив - входная бинарная картинка. 2.Берем кусок картинки 4x4(например) умножаем на набор весов(тоже 4x4(кстати как их инициализировать лучше всего?)) и суммируем, прогоняем через функцию активации, получаем пиксел новой картинки. Так со смещением в 1 пиксел прогоняем по всему массиву. Получаем двумерный массив прогнанный через первый набор весов(4x4). Таких наборов весов у нас 5, например, поэтому и выходных массивов будет 5(самое интересное как их потом настраивать?). Вот как бы в таком духе получить описание или картинкой, что с чем суммировать и в какую ячейку заносить результат.
>>441617 Ну ты почти все и расписал. Тренируется сеть по тому же принципу, что и обычная многослойная НС. Сеть вычисляет функцию y = f(W, x), где х - вход, у - выход, W - веса. Далее у тебя есть функция ошибки C(y, y'), которая возвращает одно число - подходящую тебе меру расстояния между истинным ответом и предсказанным. У меня используется negative log likelihood: C = -y' log(softmax(y)), где у' - индикатор истинной буквы. Вычисляешь градиент для весов для тренировочного примера (x, y'): grad = dC(f(W, x), y') / dW. Обновляешь веса, например, простейшим градиентным спуском: W += k grad, где k - скорость обучения.
Градиенты можешь руками посчитать для своей архитектуры, либо найти формулы в книгах, либо воспользоваться символьным вычислением, как сделал я с помощью Theano. Формулы очень громоздкие, расписывать их тут нет смысла.
>>441649 Это сверточная сеть с двумя слоями свертки 3х3, первый с 5 признаками, второй с 10. Потом идет один скрытый слой с 250 нейронами и выходной слой с 26 выходами, по одному на букву. Это одна из разновидностей архитектуры LeNet-5, я выше давал ссылки. В отличие от него я не использую субсэмплинг, с ним хуже получалось.
>>442122 Одинаковые. Я тебе выше расписал полный алгоритм. Попробуй на маленьком примере, допустим картинка 3х1 и свертка 2х1 вручную посчитать, может понятнее станет.
>>442154 В матлабе многие вещи сделаны удобнее и работают быстрее. Возможно, еще дело привычки. Графики, например, я в матлабе люблю делать.
Возможно ли нейросеть научить распознавать слово из искажённой транскрипции? Если да, то какая НС для этого применима и что по этой теме почитать желательно на русском, инглиш хуже усваивается?
>>442169 В R вообще миллион пакетов для визуализации. Но все это разнообразие бестолковое по большому счету, не будешь же каждый из них изучать. И какой выбрать - тоже непонятно. ггплот2 этот монстрообразный. Изучать тонкости его дизайна чтобы понять, как какой-нибудь лейбл налепить куда надо, мне совершенно не интересно. По-моему это эталонный пример жутко over-engineered технологии-однодневки. А Матлаб - это на века, лол. Как код на нем работал 15 лет назад, так и будет работать еще через 15 лет. А главное, я уже знаю, как там все что нужно сделать.
А чем вообще занимаются люди в области NLP, расскажи. Распознавание речи? Автоматический перевод? Перевод как мне кажется застрал на месте уже много лет.
>>442208 А что такое искаженная транскрипция? Пример приведи, чтобы понятнее было. Это из области распознавания речи?
>>442166 Т.е. если я подаю на вход (1,1) а на выходе мне надо получить (1,0), то вес будет 0.5 и на выходе мы никогда не получим (1,1) а будет всегда (0.5,0.5) ?
>>443570 Я ничего не понял из того, что ты сказал. Пусть у тебя картинка 3х1: [x0, x1, x2] и свертка 2х1. Свертка будет иметь три параметра: веса свертки [w0, w1] и смещение b. Применив эту свертку к картинке, ты получишь картинку 2х1: [x0w0+x1w1+b, x1w0+x2w1+b]. Это и есть твоя функция f, о которой я говорил выше. Дальше применяешь к ней остальные шаги.
>>443618 Ну я взял вообще самый простой пример, совсем без свертки, т.к. вес всего 1. [x0,x1], w0, [x0w0, x1w0]. Т.е. свертка дает вот такое усреднение [0.5,0.5] ?
>>443570 >на выходе мы никогда не получим (1,1) опечатался, на выходе мы никогда не получим (1,0) , конечно же. >>443628 Понятно, я просто смотрю, что вес 2 раза перенастраивается и получается, что-то среднее, зависящее от ошибок для веса со свертки. В чем и отличие от полносвязной сети.
>>443628 А вообще да, если свертка происходит, то мы можем подобрать веса чтобы получить любой сигнал на выходе. Так что мой пример не совсем корректен.
>>443630 Ну да. Все, что делает свертка 1х1 - это умножает всю картинку на число и прибавляет другое число. После настройки эти числа станут такими, что ошибка в среднем будет наименьшей. В том случае будет усреднение.
Полезность сверток в том, что они применяют один и тот же фильтр к разным частям картинки. За счет этого получается устойчивость к преобразованиям. Для полносвязной сети, например, цифра 1 посреди картинки и та же цифра, смещенная на один пиксель вбок - два совершенно разных изображения. Чтобы понять, что это одно и то же, сеть нужно долго тренировать, и она должна быть достаточно большой. Для сверточной сети взаимосвязь этих изображений более очевидна.
>>443652 Разве? А если как-то описать машине признаки и связи между ними(формализовать), не начнет ли она находить схожести и не начнет ли она также обобщать? Знаю, точно что эти же сети применяли для распознавания речи. В сети есть статья.
>>443656 Ок, наверное можно и в других задачах применять. Просто самые известные достижения у этого метода в распознавании изображений. Нужно чтобы входные данные были структурированы. В картинках используется 2д пространство, в речи, наверное, по времени свертку делают.
>>444348 В подробности вдаваться не буду, извини. Работаю с данными, полученными секвенированием нового поколения. Разрабатываю методы работы, алгоритмы, применяю их. Собеседование происходило в виде презентации с рассказом о моей предыдущей работе. Ну и плюс стандартные вопросы: почему выбрал это место, какими темами я хочу заниматься. Шел к этому, пожалуй, лет восемь целенаправленно. На уровне хобби машинным обучением занимался очень давно, года с 2002 примерно.
Оп, я тоже увлекаюсь машинным обучением, но на уровне хобби. Вот у меня задача есть, распознавание математических формул (С изображений разумеется). Ну пусть для начала не рукописных а печатных. И если как распознать определённый символ на изображении я знаю, то как разделить изображение на структурные единицы и распознать структуру - не знаю. Ведь нам важно не только узнать что в выражении есть синус или знак интеграла, а ещё и положение его в выражении, может он в числителе дроби, может в знаменателе, может в скобках. Не натолкнёшь на мысль как мне структуру выражения по-простому распарсить?
Тоже проходил на корсерке курс, а потом кучу других на edX и корсерке, а потом ещё в универе 3 семестра.
>>444656 Сложно. Я бы сначала сделал распознавание линейной записи, без дробей, степеней, индексов. Просто символы одной строкой. Тут все более-менее понятно. У формул тоже есть грамматика, примерно как в капче вакабы, которую можно использовать для уточнения распознавания. Скажем, "С" и "(" можно лучше отличить таким образом. Также это поможет выбрать более вероятный парсинг формул вроде "sinx", которые могут быть произведением s, i, n и х, но более вероятно, что это sin(x).
Когда это будет хорошо работать, можно перейти к дробям. Дроби я бы распознавал специализированным алгоритмом, как горизонтальную линию с текстом вверху и внизу. После этого вырезаешь прямоугольники сверху и снизу в отдельные картинки и рекурсивно запускаешь распознавание на них.
Степени/индексы можно отличать по вертикальному смещению, опять-таки выделять их в отдельные картинки и распознавать.
>>444669 Да, как ни странно повезло получить некоторый опыт работы в Россиюшке по машинному обучению. И это было не в Яндексе, лол. Специалиста получил в Москве, потом ПхД в Европе уже по биоинформатике.
До специализации по машинному обучению был просто кодером средней руки. Поработал в геймдеве, пофрилансил. Ничего особенного.
>>444916 А поясни нужно ли знать функан или там какую-нибудь хардкорную математику чтоб быть как ты? Ну про теорвер матстат и методы оптимизации я понимаю что их нужно знать хорошо
>>444926 Я хардкорной математики не знаю. Могу сформулировать и доказать простую теорему, но не более. Функан вроде бы ни разу в жизни не применял. Основы матана нужны часто, а также базовые дифуры (и то больше численные методы, а не аналитическое решение).
>>445046 Нашел объявление, подался, поговорил с научником. К тому времени у меня был какой-то опыт уже в смежной области (машинное обучение). Прочитал пару их статей перед собеседованием, попытался вникнуть, задал пару вопросов по ним. Этим и отличился от большинства других кандидатов, лол.
>>445085 >Функан вроде бы ни разу в жизни не применял А как же ядра, метрики, все такое?
А какие требования на ПхД были? Допустим, у меня диплом мага по теорверу и матстату, то есть никаких курсов по машинному обучению я в универе не слушал, все по теме изучал самостоятельно, таких берут? Алсо, как серьезно они рассматривают средний балл?
И вообще, пили кулстори. Как долго получал степень? Как это все происходило? Сейчас исследованиями не занимаешься? Какие подводные камни? Какие советы дашь?
>>445107 >А как же ядра, метрики, все такое? Очень поверхностно знаком. Сейчас пролистал статью по функану в вики - все какие-то абстрактные штуки. В жизни этим не пользуются.
Про ПхД нельзя так в общем сказать, все от людей же зависит. Кто-то упрется рогом в средний балл, кому-то подай статьи, другим - рекомендации от видных ученых, третьим - диплом известного вуза. Средний балл всегда спрашивают, конечно. В моем случае это не было решающим критерием. Если у тебя там одни тройки, проблемы будут 100%. Иначе - как повезет. Сходи еще в научный тред на эмиграче, там много инфы про это дело. То, что ты самостоятельно изучал - это ок. Лучше, если есть какие-то проекты свои, чтобы показать, или статьи для сиви.
Получил за три года. Тут так - тебе деньги дают на три года, не защитился за это время - крутись как хочешь. Не найдешь работу - еще и ВНЖ лишишься, это вообще жопа. Поэтому нужно ориентироваться на жесткий срок с самого начала. Происходит это примерно как обычная работа, делаешь свой проект/проекты, пишешь статьи. Нужно иметь свои идеи, свое видение проекта, для некоторых людей это сложно. Подводных камней много. Целая гора. Самые большие риски на мой взгляд: не пойдет исследование/будет плохо получаться, поссоришься с научником, не сможешь опубликоваться, не осилишь написание диссера. Это довольно рискованное вложение времени, вполне можешь прокопаться три года или больше и уйти ни с чем в результате. Однако по моим наблюдениям (около 15 случаев всего) в Рассее шанс успешно защититься гораздо меньше. Из моих европейских знакомых почти все защитились. Исследованиями сейчас занимаюсь. Биоинформатиков теперь много стало, конкуренция сильная, но и область сама постоянно расширяется. Надеюсь, на мой век хватит.
Отлаживал недавно код НС на XOR в качестве тестовой задачи. И НС с двумя скрытыми нейронами не всегда сходилась к идеальному решению. Думал баг где-то, проверял долго. Оказалось, что такая НС далеко не всегда сходится к решению, несмотря на то, что неоптимальных локальных минимумов там нет. Происходит это из-за очень пологих областей в оптимизируемой функции. Если неправильно задать диапазон весов при инициализации, то попадание в такую область почти гарантировано, и сеть никогда не будет сходиться. Вот целый трактат на эту тему: http://www.cs.stir.ac.uk/research/publications/techreps/pdf/TR148.pdf
В чем суть говнософта типа Theano, в котором простейшие примеры компилятся часами (ибо пистонопараша)? Расскажите, что там есть такого, чего нет или нельзя реализовать в пикрелейтед, древнем как говно мамонта, штутгартском нейросетевом симуляторе? Дохуя любых видов активации, методов обучения, для "нейронов" можно задавать вообще что угодно и т.д.
>>448814 >попробуй сделать на своем симуляторе сверточную НС Посоветуй, что почитать по ним годного. Я бы попробовал запилить, но почти нихуя за них не знаю.
Дофига русскоговорящих в зарубежных исследовательских группах. Но непонятно, на кой черт переписывать хороший годный туториал. Там же всё есть. Это никому не нужно.
http://synthesis.ipi.ac.ru/sigmod/seminar/s20150129 Вот еще хороший новый относительно материал, но незнающим диких математических операторов и как и где искать для своего любимого языка их решение с помощью численных методов, путь в такие нейросети закрыт.
Оп, ты спрашивал про NLP? В машинном переводе используют deep learning. Еще ты можешь зайти на тот же kaggle и посмотреть конкурс по sentiment analysis. В NLP вообще полно задач: извлечение фактов, мнений, семантика, снятие неоднозначности многозначных слов и тд и тп.
Для задач высокого уровня нужно еще подготовить текст: морфология, части речи, etc.
Мне кажется что, если перевести общение, например, в зк на английский, то куча быдла отсеется. Студенты с лабами не смогут создавать триды. Вопросы какой язык учить отпадут. Нужно обдумать какую-нибудь капчу грамматическую.
>>437727 И еще вопрос. Для настройки использовался только метод обратного распространения ошибки или в начале использовали метод ограниченной машины Больцмана?
А мы вот в шараге писали что-то типа простенького поисковика по текстам. Ну там TF-IDF, LSA.
Подскажите тему для курсача, что бы структурно пораспознавать и написать реализацию более-менее рабочую. Ну всмысле что-то типа химических формул (http://habrahabr.ru/post/172651/), таблиц или мат.формул (Почитал публикации по мат. формулам и оказалось что там слишком хардкорно, за пару месяцев не успею). Вот с таблицами можно заморочиться, ну типа распознать структуру, тексты в ячейках, но мне кажется простовато, хотя я на данный момент знаю только как сделать двухцветное изображение из фотки и как линии найти, лол.
>>449818 Я использовал градиентный спуск, т.е. обратное распространение ошибки. Не все методы работают одинаково хорошо, но различия там уже в последних долях процентов точности.
>>449825 По-моему для курсача распознавание таблицы будет очень даже хорошо. Это совсем непросто, и есть серьезный шанс что ты и это за пару месяцев не успеешь, но это хотя бы реалистичный проект.
>>437727 1. Не вижу в проекте файл с весами. 2. Сколько и какие слои делал? 3. Как подбирал начальные значения весов? 4.Функция активации гиперболический тангенс?
>>450059 Чет не хочет у меня обучаться нормально. Постоянно прыгает и меняет ответ(бывает с правильного на неправильный и т.д.). На 50к вариантах 10 цифр пытаюсь научить.
>>450356 Я не понял, что у тебя не так. Что прыгает, какой ответ меняет? Это нормально, что во время тренировки ответы меняются. Нужно смотреть на общую ошибку на отдельной выборке.
Общие рекомендации: Начни с простого. Попробуй для начала перцептрон, без скрытых слоев. Когда он заработает, добавь один скрытый слой с небольшим количеством нейронов. Отладь код на простых задачах: перцептрон, например, должен уметь решать OR, сеть со скрытым слоем - XOR.
Обучающая выборка может быть слишком сложной, с сильным шумом и искажениями.
>>450366 Это я уже делал и все получалось. Лучше скажи сколько нужно приблизительно итераций, чтобы обучить 10 цифрам разных шрифтов(20 штук) с небольшими искажениями. Иногда у меня цифры немного вылетают за границы при генерации, это допустимо при обучении?
>>450371 Зависит от того, какие у тебя итерации. Я делал стохастический градиентный спуск с минибатчами по 20 примеров. За одну эпоху (проход по тренировочному множеству, около 150000 примеров) сеть давала очень хорошее решение, с ошибкой меньше 0.1%. Это если правильно выбрана скорость обучения. Окончательно сходилась сеть примерно за десять эпох. Получается 75000 итераций (обновлений весов).
>цифры немного вылетают за границы при генерации, это допустимо при обучении? Если цифра хорошо видна и отличима от других, должно быть ок.
>Это я уже делал и все получалось. Что именно получалось? Например, какую ошибку дает твой перцептрон, обученный на тех же данных? А сеть с одним скрытым слоем? Какое количество скрытых нейронов оптимально? Какую ошибку дает сверточная сеть? Ты уверен, что возможно распознать лучше? Когда получишь ответы на все вопросы, будет понятнее, куда двигаться дальше.
>>450379 >скорость обучения Не совсем понятно как ее подобрать. Я для слоя брал 1/корень квадратный(количество весов входящие в нейрон в слое). Можно еще скорость корректировать по мере обучения.
Давайте подумаем как круто сегментировать текст. Допустим нам нужны Bounding Box'ы вокруг каждого символа, что можно придумать? Ну тривиальный случай когда все символы на бинарном изображении разрывны, просто закрашиваем Connected Components и метим каждую компоненту. А что в случае если разные символы плавают и соединены? Чёт гуглю и вообще ничего найти не могу по этой теме. Вот думаю может какой-нибудь генетический алгоритм сделать, с делением и обьединением Bounding Box'ов пока не достигнем максимальной суммы вероятностей каким-нибудь классификатором который выдаёт некую вероятность (логистическую регрессию например) того что в Bounding Box'е какой-то определённый символ.
Из условий дополнительных например - как можно меньшая площадь пересечения между Bounding Box'ами, чтоб мы не отрицали возможность их пересечения (Когда символы наезжают друг на друга) но и старались избегать такого случая, т.к это редко.
>>451233 Andrew Ng в своем курсе предлагал делать отдельный классификатор, который определяет границы между символами. Не знаю, насколько это удачная идея. Можно попробовать.
>>450395 В общем поковырялся я с весами. Настраивается очень херово при включении искажений, хотя как видно из примеров, должно хорошо обучаться даже на рукописных символах. Такое впечатление что сеть не сверточная, а обычная полносвязная с 2-мя слоями, т.к. совсем не обобщает. Ведь не должны же сеть смущать небольшие искажения и сдвиги? Без искажений добился вероятности 0.004, с искажениями 0.15. Хотя эти искажения почти не заметны. В чем подвох - хз. Может как-то хитро надо подстраивать скорость обучения?
>>453105 Любые искажения сильно затрудняют распознавание. Вообще без искажений задача тривиальна. Если у тебя 10 цифр, т.е. всего 10 возможных входных примеров, то там по одному пикселю обычно можно отличить каждую.
>Может как-то хитро надо подстраивать скорость обучения? У меня работало на константной. Я подбирал ее вручную. Обычно это в диапазоне 0.05 - 0.0001, хотя все зависит от деталей реализации.
Если хочешь подробной диагностики, то предоставь дополнительные данные, как то: кривые ошибки на тренировочном и тестовом множествах в зависимости от номера итерации. Лучше если ты к тому же сделаешь эти графики для полносвязной сети. Также приведи несколько примеров входных картинок, на которых натренированная сеть ошибается. По этим данным я попробую погадать, что не так.
>>437761 Блядь прошёл этот курс, сделал все задания, получил 100%. Вроде по ходу дела всё понимал. Так и не понял что делать когда закончил. Какие-то блядь обрывочные знания всего есть, а куда с этим идти, какие проекты пробовать делать не понял. Нейронные сети вообще хуёво объяснили, как закодить примерно понятно, а как продумать всю архитектуру нет. В итоге я просто покатился себе дальше. Делал курс осенью 2013, сейчас вообще нихуя не могу вспомнить. Хотя наверное освежить можно быстро (кроме нейронных сетей и ёбаных SVM). Не рекомендую так проходить курсы.
>>454065 Он рассказывает и про типичные случаи использования, приводит примеры. Сейчас эти технологии используются повсеместно. Распознавание, датамайнинг, рекомендательные системы очень распространены.
>>454092 Если хочешь устойчивость к небольшим искажениям, берёшь каждый пример в трейнинг сете и делаешь из него десяток других, применяя небольшие искажения.
>>453105 Добился с искажениями вероятности где-то 0.02, дальше чет не хочет(хотелось бы как и без искажений - 0.004). Шаг сделал самый маленький - 0.0001. Щас пробую с 0.00001 может чет обучится, хотя я уже стал сомневаться. Очень странно, что иногда путает очевидную 6 с 0 и еще некоторые цифры.
>>454318 Точность с искажениями всегда будет меньше. Попробуй натренировать с более сильными искажениями, а потом протестировать со слабыми. Может получиться точнее.
>>454478 Там из-за искажений цифры иногда неплохо так вылезали за границы картинки, потому вся сеть сильно перестраивалась и постоянно не могла нормально настроиться.
>>456115 Тогда не удивительно, что трудно натренировать. Зато такая сеть будет более устойчива к ошибкам сегментации. На вакабе я тренировал на идеально отцентрированных символах, которые на 100% помещались во входную картинку. В результате при малейших ошибках сегментации точность сильно падает. Приходится перебирать разные возможные варианты сегментации.
>>456652 Забросил пока что, увы. Однажды снова придет вдохновение, и я ее допилю. Там почти все работает внутри, но нужно сделать интерфейс. Это довольно трудоемкая задача.
>>456906 То есть исходя из этого ты и пробовать не стал? Мне кажется что в любом случае кто-то должен был запилить хотя бы даже маловероятностные распознаватели? Почему в сети 1.5 упоминания про нее вообще?
>>456915 Но зачем? У людей, которые могут это сделать, нет столько свободного времени. Маловероятностный распознаватель приведен выше в треде (статья с Хабра). Делать что-то значительно лучше - это на месяц работы без гарантии результата.
>>456115 Поэкспериментировал я с искажениями и что-то лучше 3.5 процента не удалось настроить, на глаз генерируемые капчи легко распознаются. Не понимаю в чем причина.
>>464676 О, как раз собирался на днях бампнуть свой тред.
Если на глаз легко распознается, то НС должна сработать. 3.5% - довольно большая ошибка на одной букве (речь ведь об этом?). Причин может быть очень много, как ты уже и сам видел. Может, сеть нужна большего размера, или инициализация не в том диапазоне. Я там повыше писал, какую я отладочную информацию использую - выложи эти графики сюда, посмотрим.
>>464741 Ок, тогда завтра уже выложу, т.к. сеть будет до завтра обучаться. Обучение будет на 100 эпох стартовый коэф обучения сделаю 0.001 и на каждой эпохе буду уменьшать в 0.9 раза. Обучение - 10000 циклов, проверка обучения - 1000 циклов.
>>464746 Для диагностики лучше сначала начать. Там будет видно, имеет ли смысл продолжать. Нужно определить такие вещи: 1) overfitting vs. underfitting. Это можно понять по графику ошибки на тренировочном и тестовом множествах. 2) сошлелся ли градиентный спуск, или нужно продолжать обучение. Просто видно из графика. 3) достаточно ли тренировочных данных. Можно понять, варьируя размер тренировочного множества.
>http://arxiv.org/abs/1502.01852 >we propose a Parametric Rectified Linear Unit (PReLU) that generalizes the traditional rectified unit. >Training A/B on four K20 GPUs, or training C on eight K40 GPUs, takes about 3-4 weeks. Не, вы это серьезно?! Алгоритм сходится месяц на кластере из 4 или 8 теслав?
>>465474 Теперь расскажи, что это такое. Какие единицы по осям, мне непонятно. Предполагаю, что это ошибка в зависимости от эпохи обучения.
График очень хаотичный. Нужно уменьшить скорость обучения. Ты для вычисления одного шага по градиенту все тренировочное множество используешь? Если самая первая точка (200) это ошибка до обучения, на случайных весах, то обучение не очень эффективно.
И еще нужно на этом же графике отобразить ошибку на тренировочном и на тестовом множестве одновременно. График должен выглядеть подобно пикрелейтеду. Важно, чтобы он был более-менее плавным и почти монотонным, особенно для тренировочного множества.
>>465545 А ты как думал? Там тренировочное множество огромное вроде бы, ну и глубокие сети всегда были адски медленными. Бесплатно ничего не бывает. Я тебе больше скажу, если десяток таких сетей натренировать и потом усреднять их показания, почти наверное ошибка будет еще меньше. Возможно, даже гораздо меньше.
>>465691 >Ты для вычисления одного шага по градиенту все тренировочное множество используешь? Ну, я как бы не уверен что равномерно берется множество, т.к. случайно(рандом), ну а из 1000 - думаю более менее берутся все(0-102 раза, 1-96 раз, например). Я так понял это неправильно?
>>465695 Случайная выборка это нормально. Я спрашивал про количество примеров, которое ты используешь для вычисления одного обновления весов. Если ты используешь для этого все или почти все примеры, это называется batch training. Это не самый эффективный способ. Я для одного обновления беру 20 примеров. Такая тренировка называется mini batch. Преимущество - гораздо большая скорость сходимости, к тому же это позволяет не застревать в мелких локальных минимумах (хотя, судя по твоему графику, у тебя проблема не в этом).
>>465837 Значит похоже я еще и веса неправильно настраивал, т.к. обновлял сразу по проходу, а надо видимо уже после пересчета всех дельт во всех слоях обновлять веса.
А вот поясните за MNIST, например. Там вообще как-то можно сортировать выдачу? Допустим, мне надо по сотне разных изображений единичек, двоек и т.д., это можно как-то отфильтровать? В R делаю вот так: to.read = file("c:/mnist/t10k-images.idx3-ubyte", "rb") readBin(to.read, integer(), n=4, endian="big") m = matrix(readBin(to.read,integer(), size=1, n=28*28, endian="big"),28,28) image(m) При этом выбирается рандомная цифра. integer() можно задать конкретно, тогда выбирается определенная цифра, ес-но. Но нигде не нашел в каком они там вообще порядке. Как быть-то?
>>468675 >Даже я, человек, не всегда правильно набираю ее Ну если ты даун только. Не набрать настолько простейшую капчу это надо постараться еще. Видел бы ты что на некоторых сайтах творилось раньше(да и сейчас еще где то осталось)
>>468669>>468676 На самом деле для машинного распознавания капча пиздецки сложная. 1) вместо цифр - только контуры. 2) контуры рваные. 3) цифры деформированные и наляпаны одна на одну. 4) левые полосочки, искажающие контуры. Итого, даже главные компоненты для одинаковых цифр будут совсем разные. Глубокие же сети глубоко соснут из-за отсутствия устойчивых характеристик одинаковых цифр на таких разных изображениях.
>>473793 Там приведен известный алгоритм обучения перцептрона. Он работает только если а) сеть является перцептроном, т.е. не содержит скрытых слоев; б) тренировочное множество линейно сепарабельно. В твоей задаче не соблюдаются оба условия. Ng и об этом тоже рассказывал в своем курсе.
>>473811 Как ни странно, но сеть у меня обучалась именно так, а наоборот не хотела почему-то. Нельзя же сеть настраивать если сеть дает правильный ответ или я неправильно понял алгоритм, что ли.
>>437727 ОП, у меня как раз вопрос. Никогда с распознаванием не имел дела. ТЗ у меня в следующем: есть фигура и нужно, чтобы пользователь не отрывая руки нарисовал похожее что-то. После проведения мышью я имею массив точек. Я думал его распознавать через определение где какая прямая и относительность длинны к другим отрезкам. Но я не могу понять как мне определить новую грань фигуры правильно, чтобы неровности в ведении мышью не были помехой. Подскажи что делать, может уже готовые алгоритмы есть... В общем хоть что-то
>>475664 Ты описал ТЗ для пользователя. Программа что должна делать? Распознать одну из нескольких возможных фигур? Или любой многоугольник?
Если многоугольники, то нужно распознавать прежде всего сегменты. На коленке прямые линии распознаются с помощью Hough transform. Сразу учти, что его утомительно настраивать, но если проявишь должное упорство, как-то распознаваться будет, кроме очень коротких отрезков. Вроде бы готовая реализация была в OpenCV, посмотри.
Если распознать нужно одну из нескольких заранее известных фигур, то я бы просто понизил разрешение и прошелся скользящим окном по картинке, сравнивая с шаблонами. Придется еще перебирать масштабы. В реализации это проще всего, но может быть слишком долго, смотри сам по своему ТЗ.
>>475702 из заранее заготовленных фигур в ТЗ по поводу производительности ничего не сказано, так что пофиг. Попробую поработать с понижением разрешения. Спасибо
>>479051 Погонял немного - пока так себе, до ИИ (как он в блоге выражается) довольно сильно недотягивает. Широко известные вещи угадывает, чуть в сторону - выдает instrumentation или еще пару общих классов, либо вообще мимо кассы.
Посмотрим, будут ли развивать. Мне интересно, до какого уровня эту технологию можно довести. Вряд ли тут возможно понимание картинки на человеческом уровне.
>>468682 1) Обрабатываешь фильтром. Можно попоробовать фотошоские, пока. Мне лень такой хуней щас страдать. Контуры заливаются. 2) Смотришь какие цифры сколько занимают по площади. Смазываешь по среднему и сравниваешь контрастность с эталоном. ... 3) Профит. Яндекс пидоры в попу ебуться.
Например единичка дает на этом полотне от балды взял 242. А девяточка дает 230. Азаза, оттенков серого. Чем больше полотно по сравнению с цифрами тем выше вероятность ошибки.
Не тут надо думать. У Яндекса буквы действительно одна на другую залезают и немного искажены (что может быть похуй в зависимости от способа распознавания). А сверху на них черные и белые полоски накладывают и поэтому кажется что рваный контур. Но это белые полоски.
>>437727 Если не 100% то там все 0%. Я заметил один момент: на некоторых сайтах когда хотя бы одна цифра набирается не правильно ее будут специально ставить в капчу. Благо сделать это не так сложно (сравнить строки и выдать хотя бы одну неправильно распознанную цифру).
>>484507 Лет пять назад следил за развитием, даже экспериментировал немного с их СДК. Потом стало ясно, что дальше игрушечных задач они его вывести не могут. Идеи там интересные про интеграцию по времени, разреженные представления. Но для простого распознавния НС и другие стандартные методы гораздо мощнее. Сейчас они неплохо развернулись с оупенсорсом. Посмотрел гитхаб, а там куча людей участвует, коммиты кипят. Не знаю, что они делают - увидим еще лет через пять. Я настроен скорее скептически.
Если тут кто-то в теме, распишите вкратце последние новости и направление развития. Я был бы очень благодарен.
>>485186 Если тебе прям литература нужна, то классикой считается Neural Networks and Learning Machines Хайкина. Это тысячестраничный учебник, покрывающий все основы на очень глубоком уровне. Про новомодное глубокое обучение там ничего нет.
>>437727 Посоны, взял очень рандомную генерацию цифр со всякими искажениями 2 ляма обучающих циклов уже дал, т.е. 20 циклов по 100к обучал 20 дней, ошибка 0.27 где-то, это нормально?
>>485453 Трудно сказать, не зная деталей. Я уже пытался диагностировать проблемы с обучением у другого анона, без особого успеха. Здесь вкратце написано, с чего начать: >>453123
Но вообще сильно рекомендую начать с какого-нибудь курса, туториала или примера. Вслепую применять эти алгоритмы бесполезно. Нужно четко представлять, как и почему это работает.
>>499546 >Эволюционный алгоритм Дерьмо собачье. И играет он как говно. Не говоря уже о том, что окружение СТАТИЧЕСКОЕ. Враги всегда совершают одни и те-же действия. Все "обучение" сводится к поиску оптимального пути.
>>499632 >То, как ты окрысился Что это значит вообще?
>это не переход на личности? Нет. Я ничего не знаю о личности афтора, и не высказывал никаких мыслей по этому поводу. Только касательно примитивности и убогости демонстрируемого ИИ. Для которого никакие нейросети ненужны. А он еще и "эволюционный" подход к нему прикрутил. Зачем козе баян? Что-то тут явно лишнее.
>Алсо, этот хрен ничего не понимает в эволюции. Ну да, я глубоко сомневаюсь в уровне знаний автора относительно эволюции. В свете его высказывания о том, что именно таким, как он изобразил, образом развилась жизнь на земле. Эволюционные алгоритмы имеют очень мало общего с эволюцией живых организмов. И странно, что автор начал заниматься эволюционной нейросетью не разобравшись, хоть примерно, с тем, что это за эволюция такая в природе.
>>499639 Вообще, еще в РИ чуваками называли грязных неопрятных тупых бомжеватых сельских парней. Странно кстати, что современные источники на это не ссылаются. Придумывают самые невообразимые происхождения для слова. Когда ему овер 300лет в русской речи.
>>499642 >>499646 Думаю, что над стилягами кто-то хорошо пошутил. Алсо >Высокую Американскую Культуру Случайно не придумаешь такое. Я как-то вопрос этих стиляг особо не изучал, но вот чисто по этому одному факту видно, как их искусственно создавали, да еще с юморком, с издевкой.
>>499641 Мне показалось, что в твоей поспешной и весьма нелестной оценке его работы проявилась какая-то личная неприязнь.
>Для которого никакие нейросети ненужны. >А он еще и "эволюционный" подход к нему прикрутил. Зачем козе баян? Что-то тут явно лишнее. Невероятные откровения. А с каких позиций ты это утверждаешь? Ты уже занимался этой задачей, ознакомился с историей вопроса? Пока что это пустословие.
>В свете его высказывания о том, что именно таким, как он изобразил, образом развилась жизнь на земле. Ну это глупость, ок. Можно списать на популистскую направленность ролика, для широких масс.
>Эволюционные алгоритмы имеют очень мало общего с эволюцией живых организмов. Общего довольно много. Все-таки придуманы эти алгоритмы были именно как модель эволюции. В данном случае нас не интересует эволюция в природе, а лишь способ решить задачу.
>>499658 >Мне показалось, что в твоей поспешной и весьма нелестной оценке его работы проявилась какая-то личная неприязнь. Показалось. Мне вот кажется что у тебя какое то очень личное отношение к "его" работе. Тебе она оче нравится? Да, забавно, уровня курсовой работы.
>А с каких позиций ты это утверждаешь? С позиций анонимного комментатора.
>Ты уже занимался этой задачей, ознакомился с историей вопроса? Вы с какой целью интересуетесь? Вам важно разобраться в вопросе, или вы хотите меня оскорбить?
>Пока что это пустословие. Не понимаю что ты этим хочешь сказать. Нет, это не пустословие. Это мое личное мнение. Мне не жаль если оно задевает чьи-то чувства, и твои в частности. Я делюсь им бесплатно и безусловно.
>Ну это глупость, ок. Можно списать на популистскую направленность ролика, для широких масс. Ох. Да нельзя я думаю. Я думаю это типичный ролик уровня статей на хабре, от хипстеров для хипстеров. Заниматься компутер саенс теперь модно, ты забыл?
>Общего довольно много. Ну, не особо. Используется примитивная модель передачи генов, на этом как правило все.
>Все-таки придуманы эти алгоритмы были именно как модель эволюции. Как примитивная модель эволюции как ее понимали те кто эти алгоритмы придумывал и тогда когда они это делали.
>способ решить задачу Через задницу. Нейросеть там лишняя чуть более чем полностью, как и эволюционный подход. Сколько оно обучалось? 24 часа? За то-же время можно было сделать поиск по графу, если не за меньшее.
>>499660 Лень искать, в книге видел. А если слово было в широком употреблении на 1850 год. То и на 1750 скорее всего было. Алсо, книгопечатание возникло где-то в конце 16 века. Так что...
>>499683 Да, мне она нравится. Пустословие - это когда тебе сказать нечего, но ты все равно говоришь. >За то-же время можно было сделать поиск по графу, если не за меньшее. О, вот уже более конкретное утверждение. Только по-прежнему необоснованное. Ты хотя бы приблизительно подсчитал, какого размера будет граф? Как ты вообще это себе представляешь, делать один шаг, записывать состояние, потом восстанавливать одно из записанных, как в А*? Это будет чудовищно долго работать, т.к. игра рассчитана на прохождение вперед. Да и состояния большие, у тебя память исчерпается на десятой секунде игрового времени. Но ты, конечно, об этом всем даже не задумывался.
Его решение линейно зависит от длины уровня, а поиск в графе - экспоненциально. И вообще-то его решение будет стремиться к общему при увеличении разнообразия уровней, а поиск в графе всегда только конкретный уровень сможет решить.
>Это мое личное мнение. Ты просто ляпнул чушь, наивно полагая себя умнее всех. Причем сделал это в агрессивной манере, свойственной невеждам.
>>499713 >Пустословие - это когда тебе сказать нечего, но ты все равно говоришь. Мне всегда есть что сказать. А вот зачем ты мне что-то пишешь - непонятно.
>Да, мне она нравится. Хорошо для тебя.
>О, вот уже более конкретное утверждение. Только по-прежнему необоснованное. Ты хотя бы приблизительно подсчитал >Ты >у тебя >но ты Еще раз, ты хочешь разобраться в вопросе, или твоя цель перейти на личности покривляться и оскорбить меня? Выглядит как последнее. Я не обязан никому ничего доказывать. И тем более тратить свое время на бесплатное обучение тех кто категорически не желает учится.
>Это будет чудовищно долго работать, т.к. игра рассчитана на прохождение вперед. 24 часов хватит.
>Его решение линейно зависит от длины уровня Морозная история.
>Ты просто ляпнул чушь, наивно полагая себя умнее всех. Причем сделал это в агрессивной манере, свойственной невеждам. Ох анончик, разберись со своими комплексами и проблемами вначале, а потом уже по интернету определяй кто что думает на другом конце интернета.
>>500030 >Интересно было бы посмотреть как разные виды нейросетей будут справляться с этой задачей. Лучше. Вообще. В вдогонку всему остальному. Для тех кто в танке. 1) Медленнее генетических алгоритмов уже нет. Потому, их нигде не применяют, разве что в курсовых работах/игрушках и прочей околонаучной деятельности. Ну кто его знает, может где-то и используют серьезно конечтно, но очень очень редко.
2) Генетические алгоритмы и нейросети это оче оче разные вещи. Они несовместимы, ваще. Если кто-то говорит о генетической нейросети - он или дурак/первокурсник или вот вот получит нобелевку. Конечно можно их как-то использовать вместе, например натренировать кучу нейросетей, а потом скрещивать их гены.
>>500033 >Почитал я про генетический алгоритм и мне показалось, что это какой-то рандомный подбор весов. Или я неправ? Мне кажется, что гений решил тренировать сеть генетикой. Да, генерировать миллион рандомных наборов весов, а потом выбирать самые успешные и скрещивать их друг с другом. Ад. Просто Ад.
ГА и НС прекрасно сочетаются. Применяется это там, где нет обучающей выборки, как альтернатива обучению с подкреплением. Обучение с подкреплением имеет много проблем на нетривиальных задачах, а НС с ГА, реализующая direct policy search, как-то обычно работает. Алгоритм, используемый в той работе про марио, называется NEAT. Он был специально разработан для наиболее эффективной нейроэволюции. Материалы по нему приведены в ссылках в описании видео.
>>500340 Кароч, вроде понятно стало, что этот алгоритм не просто рандомный выбор чисел(решения), а еще и такой, чтоб почти не повторялись предыдущие числа в других итерациях. Не совсем тогда понятно преимущество от простого инкремента.
>>500598 Меня тоже пробрало. На уменьшенной картинке ничего особенного, а как присмотришься... ИИСУСЕ!
В гугле давно занимаются распознаванием на глубоких нейронных сетях, и в статье объясняется, как были сгенерированы картинки. Звучит это правдоподобно.
>>499546 Кто-то объяснит как он сделал входные данные в сеть и "нажатие кнопок"? Это все можно сделать тока допилив тот эмулятор или есть возможность подключаться к нему независимо от языка программирования?
>>507910 Кто-то может вкратце описать как настраивать эту сеть? Я так понял там появляются нейроны(соответственно и связи) по генетическим законам. И еще нашел исходник в сети реализующий эту сеть с помощью связанных списков. Не проще ли этот алгоритм реализовать с помощью обычных массивов?
>>509204 Реализовывать можно как угодно. Если тебе проще массивами, делай так. Настройка описана в многочисленных статьях про NEAT и содержит много деталей и шагов, вкратце описать я не возьмусь. На совсем абстрактном уровне: ГА инициализируется набором случайных НС без скрытых нейронов, т.е. выходы напрямую соединяются со входами. При мутации сети у нее может измениться какой-нибудь вес, а также может добавиться новое соединение между нейронами, либо добавиться новый нейрон. При этом каждой структурной мутации присваивается номер, и при скрещивании сети проверяются на совместимость с помощью этих номеров. Это позволяет эффективно скрещивать сети, учитывая их совместимость. Также вся популяция автоматически разделяется на несколько видов, которые не скрещиваются и не соревнуются между собой. Это позволяет не сходиться к локальному минимуму раньше времени.
>>523628 ЕМУ ДОСТАТОЧНО ЧТО РЕКЛАММА ЕГО ЖОПЫ НАХОДИТСЯ НА НУЛЕВОЙ А НА ТЕБЯ ЕМУ ГЛУБОКО НАСРАТЬ ПОСКОКУ ТЫ ДЕБИЛ А МНЕ ОН НЕ ДАЕТ ИСХОДНИКИ ПОТОМУЧТО ОН ЧМОШНИК
Недавно наткнулся на такую вещь: Neural Turing Machines. Разработано в 2014 людьми из гугла, все из той же группы что занимается глубоким обучением. Статью можно прочесть здесь: http://arxiv.org/abs/1410.5401
Суть: на основе НС с особой архитектурой построено некое подобие машины Тьюринга. Имеется память относительно небольшого объема, считывающие и записывающие головки, а также программа. Все это вместе представляет из себя рекуррентную НС, и ее можно обучать на примерах с помощью backpropagation. Таким образом, эта НС может обучаться алгоритмам, выполняющимся пошагово. В статье описывается обучение копированию, многократному копированию, и сортировке объектов. Т.к. система учится не просто интерполировать тренировочные примеры, но самому алгоритму, то она обладает недостижимой ранее способностью к обобщению. Например, ее тренировали копировать строки до 20 символов длиной, а после этого она умеет копировать гораздо более длинные строки. То же самое с сортировкой. Обычные рекуррентные архитектуры никогда не могли так обобщать.
Потенциально эта технология может позволить создавать системы, обучающиеся гораздо более сложным концепциям, чем это возможно сейчас. Нынешние архитектуры делают, грубо говоря, интеллектуальную интерполяцию между тренировочными примерами. Новая архитектура может делать нетривиальную пошаговую многоступенчатую обработку данных, создавать и использовать БД, находить алгоритмические закономерности в тренировочном множестве. Это очень круто.
>>534969 >Neural Turing Machines. >реализации: >пистон https://github.com/shawntan/neural-turing-machines >го https://github.com/fumin/ntm ГО, Карл! Хотелось бы на R хотя бы. Ну чтобы была возможность стыковать, гибридизировать с чем-то еще. Так нет, сделают непригодное для использования нечто на пестони или вообще на каких-то индусских поделиях, я ебал. инбифо сам возьми да сделай!!111
>>536826 Чувак, это счастье, когда есть пейпер и код к нему в паблике. Хоть какой. Обычно кода нет, а в пейпере недостает 80% инфы, которая, в лучшем случае, общеизвестна.
Что касается языка, то Theano написан на питоне, максимум тебе Lua встретится с Torch. Theano, такая штука типа CAS, что ты описываешь нейросеть в терминах операций с векторами и матрицами, а он сам тебе символьно рассчитывает градиент твоей нейросети. Потом он тебе эту нейросеть еще и в GPU компильнет. Остальные языки, включая Go - приведут к ручному вычислению символьного градиента на бумажке, что есть полный отстой и никакого пространства для экспериментов. Если тебе нужен R, делай биндинги или аналог Theano под R (миллиард человеко-часов).
>>536990 Код не от авторов, увы. Они зажали, и в статье тоже инфы недостает. На гитхабе энтузиасты воссоздали, и они довольно долго мучились с воспроизведением результатов, насколько мне известно. Сейчас вроде работает, хотя я сам еще не проверял. >>536826 И таки да, теано это одна из стандартных систем для наколенных экспериментов с НС сейчас. Ты разберись сначала, потом критикуй.
>>537090 Whatever. R для таких задач довольно удобен. Но не чтобы на нем писать символьный дифференциатор для нейросетей. Самое интересное, что казалось бы, Хаскель тут бы хорошо подошел, однако хуй там - питон и lua.
>>537194 Офигеть, и ведь хорошо работает. Картинки: оригинал, ресайз с помощью ресемплинга (лучшая интерполяция, которую я нашел), результат этой программы.
>>537037 >теано это одна из стандартных систем для наколенных экспериментов с НС сейчас. Хуйня это из-под коня. Костыль на костыле костылем погоняет. Причем, основной код все равно на крестах или куде, пистон только в качестве враппера. Самый пиздец в том, что приходится ставить кучи ненужного говна, которое к тому же работает никак. Например, я так и не запустил код примеров с сайта. Здесь где-то спрашивал, никто нихуя не знает почему не работает (весь софт был установлен правильно, тесты проходят и компилятся нормально). И все это только из-за того что вместо враппера пистон. В том же R полно пакетов, в которых R не более чем враппер для кода на крестах, и все прекрасно работает, не считая того что сам R без всяких костылей - 64мб и сам язык изначально сделан для нужд датасайнс. А не простой ЯП общего назначения, которым обрабатывать данные можно только через хуеву тучу костылей.
>>537378 Мне надо было - я разобрался. Для ленивого ковыряния не подходит, это да. Я уже тут давал ссылку на казуальную систему: http://cs.stanford.edu/people/karpathy/convnetjs/ Кликай, и у тебя все будет тренироваться сразу же прямо в браузере. Ничего не надо ни устанавливать, ни писать. Можно менять топологию сетей и т.д.
>>537378 Ты просто тупой, смирись с этим. А в R нет ни одного пакета подобного уровня. Просто ты тупой и не понимаешь, чем Theano, который ГЕНЕРИТ КОД на С++, то есть по сути компилятором является", отличается от "враппера".
>>537435 >тупой >тупой Ясно. Какого там пакета нет? Из всего что есть в этих ваших теанах в R нет только сверточных сетей. Только, умный ты наш. Из остальных глубоких сетей есть даже перепиленный из матлабовской версии код Хинтона и Салахутдинова из той самой оригинальной работы 2006 года по глубоким сетям. Перцептронов всяких и подавно навалом.
>>537441 Нихуя тебе не ясно. У тебя проблемы с локусом контроля. Начнем с того, что Theano вообще никакого отношения к нейросетям не имеет, это просто компилятор символьных математических выражений, умеющий вычислять само выражение и производную. Ничего подобного на R нет. Там есть пакеты с хардкоженными формулами из пейперов, то есть на порядок более низкоуровневый стафф. То, что ты этого не понял, и уверен, что theano - это какой-то там враппер к С++-функциям типа caffe, это исключительно проблемы твоей непрошибаемой тупизны и обвинение всего остального мира в своей тупости.
>>537483 Это зашитый функционал, и производную ты не можешь увидеть в символьном виде в теано. Зато это компилируется в С или в ядро для куды, и работает очень быстро, ради чего это все и делалось. В симпи этого нет. Симпи предназначен для манипуляции самими выражениями, и по этой части у него очень большие возможности. В теано ничего подобного нет, там только градиенты можно вычислять, и то далеко не для всех функций.
Если вкратце пересказать, то "знаменитый" метод backpropagation является старой доброй штукой из матана dx/dy=dx/dq * dq/dx, в которой многослойная функция y=f(g(h(x)) послойно разворачивается от выхода входу.
Но это правило вычисления производной работает для любой математической формулы, которую можно представить в виде направленного графа из дифференцируемых функций. Нейросети тут - частный случай.
То есть. В simpy ты записываешь аналитический вид твоей функции, говоришь его продифференцировать, он хрустит булками, и получает вид ее производный, трехэтажный, сложный и с кучей частных случаев. К примеру, представь аналитическую производную функции max( max(2, x), max(3, y) ). В ответе у тебя будет куча интервалов - x < 2, x > 2, y < 3, y > 3 и т. п. Сложно и в принципе нам и не нужно, нам бы просто градиент вычислить, без переписывания из simpy в язык программирования этого градиента руками.
В Theano ты записываешь аналитический вид твоей функции, он представляет ее в виде графа. Далее, когда ты просишь его вычислить функцию и градиент в точке x0, он делает forward pass по графу и выдает f(x0), далее делает backward pass по графу и выдает f'(x0), вычисляя производные в каждом узле методом chain rule. Получается очень эффективно, потому что при backward pass используются значения, полученные при forward pass. На самом деле этот граф оптимизируется, упрощается и компилируется в C++ или CUDA.
При этом применимо это для любой целевой функции, которая задается в виде математической формулы. Т.е. на базе Theano ты и SVM для CUDA можешь в три строчки сделать, и любой свой метод. Конкурент у него один - Torch для LuaJIT. Наверное, это возможно написать на R, да хоть на node.js, но написали почему-то на питоне и луа.
>>537644 Да, отлично. Сейчас идет волна улучшений в глубоком обучении. Взгляды и веяния меняются прямо на глазах. Например, раньше использовали предобучение с помощью автоэнкодеров, а в этой статье это уже не упоминается. Надеюсь, в скором времени устоится некий набор правил, которые дают наилучший результат.
>>537653 Я дал выше ссылку на http://cs231n.github.io/, там в принципе все современные методы описаны. Еще пишется книжка по deep learning, в deep learning read list есть ее черновик. От предобучения избавились с помощью ReLU, dropout и некоторых других техник, которые там описаны.
>>537655 Еще хочу добавить: все это несколько сложнее, чем кажется, когда читаешь эту литературу. Например, я при тренировке НС из оппоста пытался использовать дропаут и регуляризацию, но у меня так ничего и не вышло. Без них работает лучше. А везде пишут, что это полезные вещи. т.е. я явно что-то делал не так, но что именно - непонятно.
>>537655 Я не гонюсь за передовыми статьями, лучше подождать полгода и посмотреть комментарии сообщества. А то в каждой блин статье экстраординарные результаты, которые потом почему-то не видно Вот в учебниках пишут уже действительно проверенные вещи, которые неплохо идут на практике, причем перечисляют типичные ошибки, которые без этого знания дебажишь по несколько дней.
>>537658 Лучше на training set или validation set? Если на training, то так и должно быть, потому что регуляризация уменьшает overfit. Если на validation, то, скорее всего, формулы кривые. Типа, в dropout забыл делить на p, градиент криво посчитал и т. п. (https://twitter.com/karpathy/status/626429221414563841) Если по поводу я dropout не уверен (руки не дошли), то регуляризация обязательна для избежания overfit'a.
>>537662 Градиенты у меня в теано же считаются, разве что там набажили, но это вряд ли. Я экзотики не использую. >регуляризация обязательна для избежания overfit'a Ну это, очевидно, неверно. Ты XOR тренировал когда-нибудь? Какой там может быть оверфит на одном нейроне? Оверфит далеко не всегда проявляется. У меня он был совем небольшой, и ошибки на тренировочном и валидационном множестве были почти одинаковые. Без регуляризации.
Вот о таких вещах я и говорю. В книжке написано, мол, "регуляризация обязательна для избежания overfit'a". А на самом деле там масса нюансов. Например, не сказано, что сеть должна быть достаточно большой для оверфита. От скорости обучения это тоже зависит. И т.д. Нужно все самому на своем опыте переоткрывать.
>>537698 Блин, ты вообще не о том пишешь. Не надо вручную подбирать гиперпараметры.
По уму у тебя должен быть реализован параметр лямбда, должен быть реализован параметр p. Далее твой алгоритм должен быть протестен на toy set с известным перформансом. Можно посмотреть на вид полученных фильтров - достаточно ли они ортогонально выглядят.
А потом ты уже уже не дрючишься с каждым гиперпараметром, а включаешь мета-оптимизацию по lambda и p из интервала и идешь читать двачи в поисках лучшей конфигурации. И если оно тебе подберет, что лучший результат с lambda = 0, p = 0, ну молодец. Бывает. Но это - просто частный случай.
Обратная ситуация, это через жопу: сделал алгоритм, не отладил, потом подумал, а не заебенить ли регуляризацию, заебенил, проверил с лямбдой 0.01 и 0.1 и увидел, что перформанс стал хуже, забил на это. И так с каждой новой задачей. Вместо того, чтобы машина сама этим занималась.
>>537704 Ты прямо какой-то сферический теоретик. Там гиперпараметров десятки: количество слоев, их формы, например. Если это все перебирать, ты помрешь раньше, чем оно найдет идеальную конфигурацию. Тут нужно своим умом понимать, как надо делать. А это только с опытом приходит.
Ты тут описываешь какую-то волшебную коробочку с кнопкой "сделать хорошо". Такого и близко нет. Попробуй сам что-нибудь нетривиальное сделать, поймешь.
>>539098 Почему в луа пишут нейросети и работают с ними? Что за мода такая? Дайте, кто может пошаговое описание глубокого обучения. Имеется ввиду грубую настройку Restricted Boltzmann machine. По типу считаешь матрицу по такой формуле и т.д. П.С. Смещение в моей сверточной нейросети отсутствует.
>>539795 LuaJIT обгоняет по производительности D. А так есть 2 тулзы такого рода, theano на питоне и torch7 на lua. И вот кто-то ИТТ бугуртит на питон, а кто-то на lua. Если вместо rbm взять автоэнкодер, то вот тут неплохой туториал http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial RBM я так и не понял, как работает, кстати.
>>543393 Охуеть, по этой линии ведь можно убрать деформацию изображений. Разбить на отдельные символы бы потом не сильно тяжело, потому что цифры примерно равны по ширине, ну и там разные еще полезные мелкие хинты есть. Если бы они всегда такую капчу генерировали, то проблем бы не было.
Это же две одинаковых функции fun=(exp(x)-exp(-x))/(exp(x)+exp(-x)); fun=(2/(1+exp(-2*x)))-1;
первая - гиперболический тангенс, вторая - сигма, но с примесями и с ними у меня все нормально настраивается. Не могу понять, почему не настраивается с чистой сигмой типа fun=1/(1+exp(-x)); Т.е. не получается у меня настроить, то что не симметрично точке (0;0)
Код: https://github.com/sorrge/wakabaYes
Распознает стандартную капчу вакабы с довольно сильными искажениями. Работает только если большинство букв не пересекаются на картинке.
Делал примерно неделю, для изучения тонкостей работы сверточных нейронных сетей. Получилось в принципе неплохо, на уныле точность близка к 100%. Пришел к выводу, что изначально выбрал не очень удачную стратегию с отдельными этапами сегментации и распознавания. Чтобы значительно повысить точность на более сложных примерах, где буквы сливаются, нужно как-то одновременно сегментировать и распознавать. Текущий метод для этого не годится. Тем не менее я добился цели, которую изначально ставил.
Отвечу на вопросы, да и просто можно обсудить нейронные сети, распознавание и близкие темы.