Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, anton_t, Вы писали:
_>>А питон лучше подучить, если в этой области развиваться хочешь.
S>А язык R подойдет вместо питона?
Если хочешь стать Data Scientist, то возможно, если хочешь пощупать нейронные сети как программист — тогда питон.
Здравствуйте, anton_t, Вы писали:
_>Нейронные сети давно уже решают задачи которые алгоритмически хз как решать. Например яндекс и гугл переводчиики за последние пару лет довольно сильно подняли качество перевода — за счет использования нейронных сетей. От яндекса даже была статься на хабре на этот счет.
Ради интереса. Яндексопереводчик инглиш<->рашн — вполне на уровне. А вот Дойч->Русиш — на уровне промт 15-летней давности. Недообучили? Или меньше обратной связи и т.п. Про остальные языки я уже и не спрашиваю. А может просто база инглиш выражений накопилась? Без иронии, просто интересно.
Здравствуйте, Khimik, Вы писали:
E>>Пуллинг -- это ещё один нелинейный слой, который берёт наш "квадратик" 4х4х10 и заменяет его квадратиком 1х1х10, выбирая каждый раз максимальной значение из 16-и.
K>Я чувствую какую-то путаницу в обозначениях. Здесь 4*4 — это размер растра, а третья цифра (10) — количество вариантов значений в каждом растре?
Да, обычно это называют "число каналов"
На самом деле, если понять как работает такая сетка, типа первая свёртка переводит картинки в 128 признаков, вторая по 128 признакам опознаёт цифру.
Пуллинг отвечает за "ерзанье" цифры по рамке.
Теперь можно попробовать эту штуку модернизировать.
Первый ход -- поставить пуллинг до второго слоя. Пусть пуллятся признаки, а не вероятности классов! Тогда считать надо будет меньше, а каждый признак будет вычисляться устойчивее, так что сетка станет устойчива и к каким-то ещё другим "шевелениям" картинок.
Второй ход, вместо свёртки 13x13x3 -> 1х1х128 (около 65К чисел) сделать несколько свёрток подряд, но более маленьких. Ну, например, сначала свернуть ядром 13x1x3->1x1x32 а потом ядром 1x13x32 -> 1x1x128. Получим тоже какой-то линейный оператор, но он будет должен делать больше обобщений, так как он более ограничен в выборе коэффициентов.
Потом можно ещё и 13x1x.. разбить на несколько этапов. Ну, например, 3х1х... -> 1x1x... потом ещё раз и ещё раз.
Потом можно ещё пуллинги вставить между свёртками, что бы быстрее агрегировать информацию.
Можешь пробовать учить разные такие сетки и смотреть насколько размытым картинкам они будут учиться. Например, можно картинку немного двигать, качать влево-вправо, сжимать по горизонтали/вертикали...
Потом можно просто взять MNIST
Примерно понятно?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Khimik, Вы писали:
E>>>Пуллинг -- это ещё один нелинейный слой, который берёт наш "квадратик" 4х4х10 и заменяет его квадратиком 1х1х10, выбирая каждый раз максимальной значение из 16-и.
K>>Я чувствую какую-то путаницу в обозначениях. Здесь 4*4 — это размер растра, а третья цифра (10) — количество вариантов значений в каждом растре? E>Да, обычно это называют "число каналов"
Нет, кажется вы меня путаете.
E>Идя CNN в том, что есть некое "окошко", например 13х13, которое скользит по исходной картинке, и вычисляет с ОДНИМИ И ТЕМИ ЖЕ коэффициентами свёртки, например 128 разных свёрток. В результате (если не дополнять исходную картинку 16х16 нулями), получим "картинку" 4х4 в каждом "пикселе" которой лежит 128 чисел. Теперь можем сделать ещё одну свёртку, которая из 128 числе делает 10 (то есть матрица 128х10), получаем 10 вероятностей, что в соответствующем тому или иному "пикселю" квадрате есть та или иная цифра.
Всё-таки, судя по этому тексту, обозначение 4*4*128 значит, что в каждом "пикселе" растра 4*4 содержится 128 чисел. Т.е. этот массив всё-таки трехмерный, а не двумерный, как мне вначале показалось.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Всё-таки, судя по этому тексту, обозначение 4*4*128 значит, что в каждом "пикселе" растра 4*4 содержится 128 чисел. Т.е. этот массив всё-таки трехмерный, а не двумерный, как мне вначале показалось.
Да, массив, конечно, 3-х-мерный. Я же там везде пишу, про отображение трёхмерных массивов?
Но воспринимать его можно как двухмерное многоканальное изображение.
Вот, например, RGB картинку ты как воспринимаешь? Как 2D — массив трёхканальных пикселей, или как 3D-массив? По идее можно и так и так.
Но для CNN, пуллинга и прочих подобных слоёв, первое представление удобнее.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Идя CNN в том, что есть некое "окошко", например 13х13, которое скользит по исходной картинке, и вычисляет с ОДНИМИ И ТЕМИ ЖЕ коэффициентами свёртки, например 128 разных свёрток. В результате (если не дополнять исходную картинку 16х16 нулями), получим "картинку" 4х4 в каждом "пикселе" которой лежит 128 чисел. Теперь можем сделать ещё одну свёртку, которая из 128 числе делает 10 (то есть матрица 128х10), получаем 10 вероятностей, что в соответствующем тому или иному "пикселю" квадрате есть та или иная цифра.
Я полагаю, это "окошко" в данном случае нужно как раз для того, чтобы чуть сдвинутая цифра распозналась не хуже оригинальной.
Откуда берётся 4*4 — понятно, а почему именно 128 коэффициентов свертки?
А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
E>>Да, обычно это называют "число каналов"
K>Нет, кажется вы меня путаете.
Да, я неверно понял про число вариантов.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Khimik, Вы писали:
K>Я полагаю, это "окошко" в данном случае нужно как раз для того, чтобы чуть сдвинутая цифра распозналась не хуже оригинальной. K>Откуда берётся 4*4 — понятно, а почему именно 128 коэффициентов свертки?
Ну я так понял, что в исходной сети был ещё один слой их примерно 13х13 нейронов, следующая матрица из 128 в 10 -- это он Можно 169 взять, но я думаю, что и 128 хватит
K>А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
Оба раза да
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
K> ... Поэтому для освоения НС мне, возможно, необходимы хорошие видео. Мне кажется, лучшим вариантом было бы видео, где знающий человек долго объясняет профанам суть концепции, и до тех понемногу начинает доходить.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Khimik, Вы писали:
K>>Я полагаю, это "окошко" в данном случае нужно как раз для того, чтобы чуть сдвинутая цифра распозналась не хуже оригинальной. K>>Откуда берётся 4*4 — понятно, а почему именно 128 коэффициентов свертки? E>Ну я так понял, что в исходной сети был ещё один слой их примерно 13х13 нейронов, следующая матрица из 128 в 10 -- это он Можно 169 взять, но я думаю, что и 128 хватит
Если 169, то я это понимаю так: исходный слой из 13*13 нейронов умножается на выделенный участок растра тоже размером 13*13; это не матричное умножение, просто для каждого пикселя значения из обоих растров перемножаются, получается третий растр. Всё так?
K>>А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
E> Оба раза да
Сорри, ещё раз: матрицы для превращения 128 компонентов в 10 одинаковые для всех 4*4 ячеек?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Если 169, то я это понимаю так: исходный слой из 13*13 нейронов умножается на выделенный участок растра тоже размером 13*13; это не матричное умножение, просто для каждого пикселя значения из обоих растров перемножаются, получается третий растр. Всё так?
Нет, именно матричное 169 или 13х13 с одной стороны и 169 с другой, или 128 или 100 или ещё сколько-то...
В оригинальной же (твоей) сетке был полносвязанный слой, где каждый нейрон зависел от каждого входа?..
K>>>А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
E>> Оба раза да
K>Сорри, ещё раз: матрицы для превращения 128 компонентов в 10 одинаковые для всех 4*4 ячеек?
Да одинаковые, в этом идея CNN, что одно и то же ядро применяется во всех местах растра.
И первая матрица 13х13 на 169 тоже одна для всех положений квадратика 13х13
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Понять как работает нейронная сеть крайне просто. Нейронка по сути это машинка по преобразования сигнала типа А в сигнал типа Б. Но как сигнал в мире преобразовать? Сигнал в природе это обычно гладкая или кусочно-гладкая функция, которая естественно раскладывается в ряды (на множители или по синусам), что бы поставить знак равенства между двумя рядами А и Б — нужно подобрать коэффициенты преобразования. В конце концов вы решаете задачу оптимизации преобразования путем подбора коэффициентов. Подавая вариативные данные, вы и подбираете наиболее близко коэффициенты преобразования (т.е. обучаете нейронку) — т.е. в матрицу преобразования записываете значения, подбирая каждый из них более точно. Это все в рамках одного слоя, дальше добавляя слои, вы уже на основе тех данных разложения принимаете их как сигнал и делаете так же... уже с ними... в конце концов имеете разложение уже нужного вам сигнала (то что вы хотите получить в качестве результата вашей сети). Если при обучении данные будут слишком отличаться, то сигнал будет не гладким, и разложение в ряд станет не возможно и получится каша в весах разложения со всеми вытекающими. В общем все очевидно.
S>что касается философии, то нейросети имеют очень ограниченную область применения, в первую очередь потому, что программисты возлагают большие надежды на их способность к самообучению, но при этом упускают из виду то, что эффективный характер обучения объекта подразумевает взаимодействие с этим объектом, а при взаимодействии объект ведёт себя совершенно иначе, чем при просто наблюдении. и вот тут-то нейросети наталкиваются на философский закон: нельзя познать систему до конца, если ты сам являешься её частью. S>Мой совет: почитайте математику лежащую в основе нейросетей — она интересная, но прежде чем программировать приложения задумайтесь на сколько ваша нейросеть будет чувствительна к обучающему набору? может оператор или эвристические алгоритмы/шаблоны справятся лучше? К примеру: Abbyy по состоянию на 2006 год нейросети точно не использовала, да и сейчас скорее всего не использует.
подскажите пожалуйста что можно почитать по эвристическим алгоритмам/шаблонам
Здравствуйте, Erop, Вы писали:
E>И первая матрица 13х13 на 169 тоже одна для всех положений квадратика 13х13
Я вроде понял так.
Напомню, текущая задача – НС, которая распознаёт цифры от 0 до 9 на рисунке 16*16 из готового шаблона, но с произвольным сдвигом; например должно распознаваться это:
Делается НС из трёх слоёв. “Синапсы” от первого ко второму слою – это массив 256*16*10; последний индекс соответствует цифре, первый – исходному растру, второй – это массив окошек общим размером 4*4.
Например, в этом массиве слой X*1*1 выглядит, например, так:
Здесь внешние пиксели чёрные, поскольку окно имеет размер 13*13, то что за этими границами – просто обнуляется. Я рисую неточно. Вторая цифра 1 в X*1*1 означает левое нижнее окошко, третье – что распознаётся единица.
При перемножении исходной картинки 16*16 на эту матрицу синапсов получается матрица 16*10. Опять же, последний индекс – конкретная цифра которая распознаётся, первый – номер пикселя в растре 4*4.
Если на вход подавался рисунок с единицей, который изображён в начале поста, то эта матрица 16*10 будет большей частью заполнена нулями или близкими к нулю значениями, за исключением элемента 16*1: он будет равен 1.0, что означает что в пикселе с номером 4*4 картинки совпали и при перемножении растров получилось максимальное значение.
Здесь, правда, я уже изрядно запутался. Во-первых, я стал рисовать цветные рисунки, в то время как для начала проще было бы разобраться с бинарными чёрно-белыми. Во-вторых, если перемножать бинарные растры, то наверно должно использоваться умножение XOR (ноль на ноль дают один, один на один тоже дают один). А как сделать XOR для небинарных рисунков, да ещё цветных – мне непонятно.
В третьих, чтобы при перемножении совпадающих шаблонов получилось в сумме 1.0, надо ещё их отнормировать.
Но это наверно частности. Далее идёт переход от второго к третьему слою: в каждом слое 4*4 значения просто суммируются, и получается массив из 10 чисел. Если на вход подавался рисунок двойки (в любом положении), то второй элемент массива будет равен 1.
Тем не менее, а я по-прежнему не вижу философского камня фундаментального принципа НС. Возникает такой вопрос: не является ли изложенная выше НС относительно медленной по сравнению с продвинутыми НС, которых обучали по Deep Learning и которые могут распознавать гораздо более произвольные рисунки?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Поздно заметил данную дискуссию (только после переноса её в новый раздел форума), но всё же попробую высказать свой вариант объяснения, так сказать максимально обобщённый — вроде не видел ещё такого в данной темке.
Рассмотрим задачу распознавания (не обязательно нейронными сетями, а вообще), используя как раз твой пример с изображениями цифр. В общем случае эта задача означает, что нам надо написать некий алгоритм у которого на входе есть вектор значений X, состоящий из N элементов (для картинки в градациях серого N=W*H), а на выходе вектор Y, состоящий из М элементов (для твоей задачки M=10 — по количеству распознаваемых объектов). Т.е. по сути нам надо задать M функций вида y_i=f_i(X, P), где P — это вектор параметров из К элементов (К определяется видом алгоритма и может быть вообще равно нулю). При этом имеется набор входных значений X_0 (образцы цифр в твоём случае), для которых известны правильные значения Y_0 (указание цифры на образце). Под такую формулировку можно подвести все подобные алгоритмы, а не только нейронные сети. Например помнится я решал почти (только там задавалось не изображение, а путь пера) твою тестовую задачку с помощью алгоритма DTW и получалось получше нейронные сетей.
Теперь посмотрим как в это укладываются нейронные сети. Собственно нейронные сети задают некий большой класс таких вот функций f_i(X, P), с одним довольно простым, но очень полезным свойством. А именно, если мы берём в качестве нашего алгоритма набор функций f_i(X, P), являющийся нейронной сетью, то мы автоматически получаем готовый (причём даже не в математическом смысле, а прямо в физическом — можно банально скачать готовый код) алгоритм для вычисления вектора P по набору данных X_0, Y_0. Выполнение этого готового алгоритма и называют собственно обучением нейронной сети.
Вроде бы это всё звучит крайне банально, но если ты взглянешь на все остальные алгоритмы в данной области, то увидишь, что в лучшем случае там надо подбирать руками множество неочевидных параметров, а в худшем случае подбирать вообще код. Так что возможность просто скачать, запустить и получить в итоге готовый алгоритм выглядит прорывом в данной области, причём именно с точки зрения прикладного бизнеса. Потому как вполне реально что какой-то ручной алгоритм выдаст результаты намного лучше нейронной сети, но пока его будут делать, нейронная сеть будет уже несколько лет продаваться и приносит прибыль...
Здравствуйте, Khimik, Вы писали:
K>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу. K>Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы.