Разрешение компьютерам видеть - звучит одновременно и захватывающе, и пугающе. Однако, как я уже говорил, компьютеры «видят» иначе, чем мы. Там, где мы можем воспринимать формы, цвета и движения различных объектов, машины получают миллионы числовых значений. Это означает, что если один человек может идентифицировать оранжевый цвет на изображении, компьютер вместо этого будет иметь диапазон чисел, отображающих значения RGB для каждого изображения.

Кто-то может спросить, почему многослойных персептронов (MLP) недостаточно для обеспечения глубокого анализа изображений. Что ж, в машинном обучении существует алгоритм, гораздо более подходящий для анализа изображений, который называется сверточными нейронными сетями (CNN / ConvNets). В этом алгоритме используются два разных вычисления: уровни свертки и объединения. Они отлично подходят для выявления определенных закономерностей на изображениях с помощью «фильтров». Это может показаться немного запутанным, однако я буду повторять каждый термин в этой статье.

Вам может быть интересно, какие конкретные узоры присутствуют в изображении. Возьмем, к примеру, это изображение:

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

Одно замечание:
Более простые геометрические фильтры - это то, что можно было бы ожидать в самом начале сверточной нейронной сети. По мере того, как наша нейронная сеть углубляется в изображение, фильтры также постепенно усложняются. Фильтры могут начинаться с обнаружения линий, кривых или краев и постепенно обнаруживать целых собак или ящериц.

Ядра / фильтры

В нашем примере нейронной сети представим, что у нас есть входной слой, который принимает изображения уток. Следующий слой - это наш сверточный слой - всякий раз, когда мы определяем сверточный слой, нам также необходимо определить, сколько фильтров (ядер) мы хотим. Допустим, для этого сверточного слоя нам нужен один фильтр с матрицей 3x3. Все значения в матрице будут инициализированы случайными значениями.

Когда нейронная сеть получает изображение, ядро ​​будет скользить по каждому блоку 3x3 пикселей от входа до тех пор, пока не будет покрыт каждый блок 3x3 пикселей.

Свертка

Это «скольжение» формально считается свертыванием. В качестве альтернативы мы могли бы сказать, что это ядро ​​выполняет свертку по каждому блоку 3x3 пикселей из входного изображения. Ядро, скользящее по каждому блоку 3x3, представляет собой относительно простую операцию - поэлементное умножение, которое приводит к меньшей матрице, как показано ниже.

Это может привести к нечетким изображениям с большим разнообразием значений пикселей. Например, значения пикселей «7» с правой стороны.

Используя второй тип операции в CNN, мы можем сделать это изображение резче.

Максимальное объединение

Используя Max-Pooling, мы можем извлечь только самые важные функции из запутанного вывода. Сначала мы определяем область n на n, затем при максимальном объединении берется максимальное значение пикселя в этой области и добавляется к меньшей матрице.

Определенные шаги могут привести к конкретным обнаружениям. До этого момента мы видим, как наше ядро ​​перемещается по каждому пикселю, это может означать, что наш шаг будет установлен на 1. Однако также можно установить для вашего шага другое число - чем выше ваш шаг, тем меньше результирующая 2D-матрица. Это связано с тем, что увеличение шага означает пропуск пикселей, когда ядро ​​перемещается по своему следующему набору входных данных, тем самым еще больше уменьшая размер выходной матрицы.

Сверточный слой

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

Переоснащение

Когда вы тренируете модель, может возникнуть странное явление, когда ваша модель гипер-ориентирована на определенный набор данных. Настолько, что ваша модель пытается запомнить данные вместо того, чтобы использовать их для обучения модели. Это приводит к настройке различных параметров для определенного набора данных. Хотя ваш тестовый набор данных может иметь безумно высокую точность, проверочный тест докажет, что ваша модель запомнила введенные данные.

Если это происходит с моделями во время обучения, как мы можем этого избежать?

Ранняя остановка

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

Что ж, ваша модель может иметь чрезвычайно высокую точность обучения, однако чаще всего это связано с тем, что ваша модель переоснащает ваши данные, как упоминалось выше. Ранняя остановка позволяет разработчику проверить, насколько на самом деле точна его модель, отложив набор данных для проверки, который представляет собой совершенно новые данные, которые модель никогда раньше не видела. Затем эти новые данные будут отправлены через CNN для определения их точности.

Регулярно проверяя, действительно ли ваша модель такая же точная, как и в наборе обучающих данных, вы можете в максимально возможной степени избежать переобучения модели.

Увеличение изображения

Как правило, для создания точной модели требуется огромный объем данных и много времени. Но что, если у вас не было столько данных, сколько вам хотелось бы. Возможно ли для вас подготовить достойный CNN? Можно ли сгенерировать новые данные из уже существующих?

Введите Image Augmentation - умный способ получить больше данных, чем вы имеете в настоящее время. Логика, лежащая в основе этой концепции, заключается в том, что если бы вы изменили ранее существовавшие изображения с помощью различных модификаций, таких как поворот или масштабирование, вы могли бы генерировать новые точки данных, которые затем можно было бы использовать для обучения своей CNN.

Увеличение изображения также помогает уменьшить вероятность переобучения вашей модели данными, поскольку оно изменяет изображения под разными углами, так что ваша модель не привыкает видеть одно и то же изображение, вместо этого ей будут подаваться разные версии одних и тех же изображений.

Выбывать

Когда модель обучается, некоторые нейроны могут иметь больший вес, чем другие. Когда это происходит, изменение нейронов с большим весом значительно повлияет на результат модели. Это означает, что будут существовать некоторые нейроны, которые не имеют большого веса, и поэтому их веса настраиваются не так часто, как нейроны с большим весом. Решая эту проблему, мы можем преодолеть переоснащение, но как мы можем это решить?

Используя dropout, вы можете «выключить» некоторые нейроны, что означает, что они не будут обновляться / использоваться, впоследствии они не повлияют на вывод модели. Это позволяет нейронам с меньшим весом компенсировать слабину, позволяя им активироваться. Затем это обучит нейроны модели, которые ранее были бездействующими, что позволит модели вычислить выходные данные без запоминания набора данных.

Закодированный пример

Перейдите по этой ссылке, чтобы посмотреть мой проект. В моем закодированном проекте я обучил CNN классифицировать различные изображения кошек и собак в соответствии с их соответствующими ярлыками. Я также добавил несколько строк кода, чтобы читатель мог видеть различные дополнения своих данных.

В целом, я достиг ~ 80% точности с архитектурой модели, которую я использовал, и с методами, обсуждаемыми в этой статье. Хотя это не невероятная точность, я был очарован резким изменением точности за счет ранней остановки, увеличения изображения и исключения. Экспериментируя с разными архитектурами моделей и значениями для инициализации разных слоев, мне удалось получить точность ~ 96%. В конце концов, большая часть машинного обучения - это эксперименты!

Подробнее обо мне - меня зовут Рохан, я 16-летний ученик старшей школы, изучающий прорывные технологии, и я решил начать с искусственного интеллекта. Чтобы связаться со мной, свяжитесь со мной через мою электронную почту или LinkedIn. Я был бы более чем рад поделиться любыми мыслями или узнать о том, что у вас есть. Кроме того, я был бы признателен, если бы вы подписались на мою ежемесячную рассылку новостей. До следующей статьи 👋!