Pull to refresh

Comments 10

Мне одно всегда не понятно, а как эту математику конкретно привязать к практическому — примеру — классификация. Может ли автор также подробно описать как машина с помощью нейросети определяет «кота» на фото. Как те же «коты» описываются математически, чтобы привязать их к формулам и математическим выражениям. Понятно, что можно взять готовое, но тут мне важно как это делается в более глубоком понимании и пошагово. Вот это сама суть. Спасибо.
Если кратко, то сеть в процессе обучения на тренировочных примерах находит такие параметры весовых матриц, которые позволяют ей отличить котов от других классов. Во второй статье я постараюсь разобрать формулы, благодаря которым и происходит обучение и подбор нужных параметров

Вот несколько ссылок, где сможете прочитать подробнее для «интуитивного» понимания: раз, два, три

Сеть проходит по изображению и выделяет фичи. Если Вы взгяните на гифку, то заметите, что свёртка проходит по всем областям изображения. Что это означает? Очень просто. Фактически мы перебираем все подизображения и пытаемся выделить устоявшиеся паттерны (каждый паттерн — отдельная свёртка), т.е. обеспечить инваринтность относительно смещения для того или иного паттерна.


Такая процедура происходит для всех возможных свёрток. Каждая свёртка — отдельный паттерн. Паттерны формируются на основе статических закономерностей, которые присутствуют на картинках, путём обратного распространения ошибки.

Спасибо, теперь уже яснее стало. Но вот у вас в статье и в тех статьях, что вы дали посмотреть, изображения на каждом пикселе имеют конкретные числовые значения

в Первой статье это контраст чёрное-белое — степень насыщенности от 0 до 255

Во второй и третьей статье есть цветные изображения, соответственно каждый пиксель кодируется набором трёх значений (например RGB). Это получается, надо машине просматривать значение для каждого основного цвета — Red, Green, Blue. И если в первой статье картинка берётся 18x18 пикселей и там только чёрное и белое, то здесь фото может быть и 1000x1000 и более; и для каждого пикселя три значения. Потом мы настраиваем фильтр по этим цветам и размерам области в пикселях — создаём несколько свёрточных слоев по цветам и определяем границы таким образом. Т.Е. процесс сводится к тому чтобы найти границы — где объект, а где всё остальное. Эти веса можно применять несколько раз или создавать другие вместе с этими изменяя размеры области изображения. Я правильно понял? :-)
Что ж, вроде все правильно поняли. Каналы изображения (rgb) рассматриваются сетью как карты признаков, как если бы они пришли с предыдущего слоя сети. Веса “настраиваются” когда вы подаете модели обучающий набор изображений (то есть в процессе обучения модели вы даете изображение и верный класс для него, сеть же должна подобрать такие параметры весовых матриц, чтобы выдаваемый ей класс совпадал с правильным). Сформированные таким образом веса используются уже на других выборках изображений (для которых у вас может и не быть верных классов, то есть здесь обучения не происходит и веса сети больше не меняются).
Полностью согласен с автором в плане нехватки доходчивых статей на границе между математической теорией персептрона/обратного распространения и практической их реализацией на python. Все либо уходят глубоко в теорию, либо сразу приводят код на tensorflow/torch/etc, где всё уже завёрнуто в black-box готовые модули, которые иногда и ошибки содержат.

На мой взгляд, для человека, который хочет не просто обучать готовые сети на своих данных, а проектировать новые архитектуры не помешает хотя бы раз — (1) Запрограммировать обратное распространение вручную (2) Заморочиться с согласованием размерностей матриц при реализации свёртки (3)(n) → Успех
В своё время мне очень понравился tutorial Stanford UFLDL, в котором даётся и теория, и необходимая практика.

<TL;DR> Автору спасибо за статью и жду продолжения. Надеюсь ссылка выше может пригодиться в написании!

Я не очень понял, почему вы рассматриваете свёртку, которая использует всё изображение, т.е. используете бесконечные суммы.

на самом деле в коде я не использую бесконечные суммы (можете посмотреть), а определяю через code_demo_indexes.py стартовый и конечный значения для a и b. Написать формулу с «бесконечностью» мне показалось лучшей идеей, чем под значком суммы писать выражения, по которым определяются начальные и конечные значения по осям ядра (сами эти выражения я определяю чуть дальше в статье). Тем более что вариант написания формулы с бесконечностью я находил и в других статьях в интернете. Надеюсь, стало понятнее

Я всё равно не срубаю физического смысла. Т.е. получается что агрегация происходит по всему изображению. Но это же неверное. Смысл в том, чтобы агрегировать изображение локально. Разве не так?

Sign up to leave a comment.