Погружение в свёрточные нейронные сети. Часть 5 / 1 — 9 |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-07-05 21:13 Полный курс на русском языке можно найти по этой ссылке. Оригинальный курс на английском доступен по этой ссылке. Выход новых лекций запланирован каждые 2-3 дня.Содержание
Интервью с Себастьяном Труном — Итак, сегодня мы снова здесь, вместе с Себастьяном и говорить мы будем о переобучении. Эта тема нам очень интересна, особенно в практических частях текущего курса по работе с TensorFlow. Введение — Привет! И снова добро пожаловать на курс! Набор данных кошек и собак До этого момента мы работали только с изображениями в оттенках серого цвета и размером 28х28 из набора данных FASHION MNIST. В реальных же приложениях мы вынуждены сталкиваться с изображениями различного размера, например, такими, которые показаны ниже: Как мы уже упоминали в начале этого урока, на этом занятии мы будем разрабатывать свёрточную нейронную сеть, которая сможет классифицировать цветные изображения собак и кошек. Для реализации задуманного мы воспользуемся изображениями кошек и собак из набора данных Microsoft Asirra. Каждое изображение в этом наборе данных обладает меткой 1 или 0, если на изображении, соответственно, собака или кошка. Несмотря на то, что набор данных Microsoft Asirra содержит более 3 млн размеченных изображений кошек и собак, лишь 25 000 доступы публично. Тренировка нашей свёрточной нейронной сети на этих 25 000 изображениях займёт очень много времени. Именно поэтому мы будем использовать небольшое множество изображений для тренировки нашей свёрточной нейронной сети из доступных 25 000. Наше подмножество тренировочных изображений состоит из 2 000 шт и 1 000 шт изображений для валидации модели. В тренировочном наборе данных 1 000 изображений содержит кошек, а другая 1 000 изображений — собак. О наборе данных для валидации мы поговорим немного позже в этой части урока. Работая с данным набором данных мы столкнёмся с двумя основными трудностями — работа с изображениями разного размера и работа с цветными изображениями. Давайте начнём изучение того, каким образом необходимо работать с изображениями различных размеров. Изображения различного размера Наше первое испытание будет заключаться в решении задачи обработки изображений различного размера. Всё потому, что нейронной сети на вход нужны фиксированного размера данные. В качестве примера вы можете вспомнить из наших предыдущих частей использование Перед тем как передавать нейронной сети изображение элемента одежды мы его преобразовывали в 1D-массив фиксированного размера — 28х28 = 784 элемента (пикселя). Так как изображения в наборе данных Fashion MNIST были одного размера, то и результатирующий одномерный массив был одного размера и состоял из 784 элементов. Однако, работая с изображениями различного размера (высота и ширина) и преобразовывая их в одномерные массивы мы получим массивы различных размеров. Так как нейронные сети на входе требуют данных одного размера, то просто отделаться преобразованием к одномерному массиву значений пикселей уже не сработает. Решая задачи классификации изображений мы всегда прибегаем к одному из вариантов унификации входных данных — приведение размеров изображений к единым значениям (resizing). В этом уроке мы прибегнем к изменению размеров всех изображений к размерам 150 пикселей по высоте и 150 пикселей по ширине. Преобразовывая изображения к единому размеры мы, тем самым, гарантируем, что на вход нейронной сети будет поступать картинка нужного размера и при передаче во
В результате мы получил одномерный массив состоящий из 150х150 = 22 500 значений (пикселей). Следующей проблемой с которой нам предстоит столкнуться будет проблема цвета — цветные изображения. О них мы поговорим в следующей части. Цветные изображения. Часть 1 Для того чтобы разобраться и понять, каким образом свёрточные нейронные сети работают с цветными изображениями нам стоит углубиться в то, как именно СНС работают вообще. Давайте освежим в памяти то, что мы уже знаем. Пример выше — изображение в оттенках серого цвета и то, каким образом его интерпретирует компьютер в виде двумерного массива значений пикселей. Пример ниже — изображение, на этот раз цветное и то, каким образом его интерпретирует компьютер в виде трёхмерного массива значений пикселей. Высота и ширина 3D-массива будет определена высотой и шириной изображения, а глубина (depth) определяет количеством цветовых каналов изображения. Большинство цветных изображений могут быть представлены тремя цветовыми каналами — красным (red), зеленым (green) и синим (blue). Изображения, которые состоят из красного, зеленого и синего каналов называются RGB-изображениями. Объединение этих трёх каналов в результате даёт цветное изображение. В каждом из RGB-изображении, каждый канал представлен отдельным двумерных массивом пикселей. Так как количество каналов у нас равно трём, то и в результате у нас будут три двумерных массива. Таким образом цветное изображение состоящее из 3 цветовых каналов будет иметь следующее представление: Цветные изображения. Часть 2 Итак, так как наше изображение теперь будет состоять из 3 цветов, а значит будет представлять собой трёхмерный массив значений пикселей, то и наш код необходимо будет изменить соответствующим образом. Если посмотреть на код, который мы использовали в нашем прошлом уроке, когда решали задачу классификации элементов одежды на изображениях, то можно заметить, что мы указывали размерность входных данных:
Первые два параметра кортежа Теперь, когда задача стала чуточку сложнее, а наши изображения кошек и собак стали различного размера (но преобразуются к единому — 150х150 пикселей) и содержат 3 цветовых канала, то кортеж значений должен быть тоже другим:
В следующей части мы посмотрим, каким образом происходит вычисление свёртки при наличии трёх цветовых каналов в изображении. Операция свёртки на цветных изображениях В прошлых уроках мы научились выполнять операцию свёртки на изображениях в оттенках серого. Но каким образом выполнять операцию свёртки на цветных изображениях? Давайте начнём с повторения, каким образом выполняется операция свёртки на изображениях в оттенках серого. Всё начинается с фильтра (ядра) определённого размера. Фильтр располагается на определенным преобразуемым пикселем изображения, затем каждое значения фильтра умножается на подлежащее значение пикселя в изображении и все эти значения суммируются. Итоговое значение пикселя устанавливается в новом изображении в том месте, где находился преобразованный исходный пиксель. Операция повторяется для каждого пикселя исходного изображения. Стоит так же вспомнить, что при операции свёртки, дабы не терять информацию на границах изображения, мы можем применить выравнивание и дополнить края изображения нулями: Теперь давайте разберёмся, каким образом мы можем выполнить операцию свёртки над цветными изображениями. Так же, как и при преобразовании изображения в оттенках серого, начнем мы с выбора размера фильтра (ядра) определённого размера. Единственная разница сейчас будет в том, что теперь и сам фильтр будет трёхмерным, а значение параметра глубины (depth) будет равно значению количества цветовых каналов в изображении — 3 (в нашем случае — RGB). К каждому "слою" цветового канала мы так же будем применять операцию свёртки фильтром выбранного размера. Давайте посмотрим, как это будет на примере. Представьте, что у нас есть RGB-изображение и мы хотим применить операцию свёртки следующим 3D-фильтром. Стоит обратить внимание на тот факт, что наш фильтр состоит из 3х двумерных фильтров. Для простоты давайте представим, что наше RGB-изображение размером 5х5 пикселей. Вспомним так же, что каждый цветовой канал представляет собой двумерный массив значений цветов пикселей. Как и при выполнении операции свёртки над изображениями в оттенках серого, так же и с цветными изображениями — осуществим выравнивание и дополним изображение по краям нулями, чтобы исключить потерю информации на границах. Теперь мы готовы к выполнению операции свёртки! Механизм выполнения свёртки для цветных изображений будет аналогичным процессу, который мы выполняли с изображениями в оттенках серого. Единственная разница между выполняемыми операциями над изображениями в оттенках серого и цветными — операцию свёртки теперь необходимо выполнить 3 раза по каждому цветовому каналу. Затем, после того как мы выполнили операцию свёртки над каждым цветовым каналом — складываем три полученных значения и прибавляем к ним 1 (стандартное значение используемое при выполнении операций подобного рода). Полученное новое значение фиксируем в той же позиции в новом изображении, в какой позиции находился текущий преобразуемый пиксель. Подобную операцию преобразования (операцию свёртки) мы выполняем для каждого пикселя в нашем исходном изображении и по каждому цветовому каналу. В этом конкретном примере результатирующее изображение получилось такого же размера по высоте и ширине, как и наше исходное RGB-изображение. Как можно заметить, применение операции свёртки единственным 3D-фильтром даёт в результате единственное выходное значение. Однако, когда работа ведётся со свёрточными нейронными сетями, обычной практикой считается использование более одного 3D-фильтра. Если мы будем использовать более одного 3D-фильтра, то результатом будет несколько выходных значений — каждое значение на результат работы одного фильтра. В нашем примере выше, так как мы используем 3 фильтра, то результатирующее 3D-представление будет иметь глубину 3 — каждый слой будет соответствовать выходному значению преобразования одного фильтра над изображением со всеми его цветовыми каналами. Если, например, вместо 3 фильтров мы решили бы использовать 16, то выходное 3D-представление содержало бы 16 глубинных слоёв. В коде мы можем контролировать количество создаваемых фильтров передавая соответствующее значение для параметра
Так же мы можем указывать размер фильтра через параметр
Запомните, что во время тренировки свёрточной нейронной сети, значения в 3D-фильтрах будут обновляться, чтобы минимизировать значение функции потерь. Теперь, когда мы знаем как выполнять операцию свёртки на цветных изображениях, пора разобраться с тем, как к полученному результату применять операцию подвыборки по максимальному значению (тот самый max-pooling). Операция подвыборки по максимальному значению на цветных изображениях Давайте теперь научимся выполнять операцию подвыборки по максимальному значению на цветных изображениях. По сути, операция подвыборки по максимальному значению работает таким же образом, как работает с изображениями в оттенках серого с небольшой лишь разницей — операцию подвыборки теперь необходимо применить к каждому выходному представлению, которые мы получили в результате применения фильтров. Давайте посмотрим на пример. Для простоты давайте представим, что наше выходное представление выглядит таким образом: Как и ранее, мы будем использовать ядро размером 2х2 и шагом 2 для выполнения операции подвыборки по максимальному значению. Операция подвыборки по максимальному значению начинается с "установки" ядра размером 2х2 в левом верхнем углу каждого выходного представления (представления, которое было получено после применения операции свёртки). Теперь мы можем начать выполнять операцию подвыборки по максимальному значению. Например, в нашем первом выходном представлении в ядро размером 2х2 попали следующие значения — 1, 9, 5, 4. Так как максимальное значение в этом ядре — 9, то именно она и отправляется в новое выходное представление. Подобная операция повторяется для каждого входного представления. В итоге мы должны получить следующий результат: После выполнения операции подвыборки по максимальному значению в результате получаются 3 двумерных массива, каждый из которых размером в 2 раза меньше исходного входного представления. Таким образом, в этом конкретном случае, при выполнении операции подвыборки по максимальному значению над трёхмерным входным представлением мы получаем в результате трёхмерное выходное представление той же глубины, но со значениями высоты и ширины в два раза меньше исходных значений. Итак, это вся теория, которая нам понадобится для дальнейшей работы. Теперь давайте посмотрим, как же это будет работать в коде! CoLab: кошки и собаки Оригинальный CoLab на английском языке доступен по этой ссылке. CoLab на русском языке доступен по этой ссылке. В этой обучающей части мы обсудим то, каким образом можно классифицировать изображения кошек и собак. Мы разработаем классификатор изображений с использованием Идеи, которые будут затронуты в этой части: Мы получим практический опыт разработки классификатора и разовьём интуитивное понимание следующих концепций:
Перед тем как мы начнем... Перед тем как запускать код в редакторе, рекомедуем сбросить все настройки в Runtime -> Reset all в верхнем меню. Подобное действие позволит избежать проблем с нехваткой памяти, если параллельно вы работали или работаете с несколькими редакторами. Импортирование пакетов Давайте начнём с импорта нужных пакетов:
Импортируем
Загрузка данных Разработку нашего классификатора мы начинаем с загрузки набора данных. Набор данных, который мы используем представляет собой отфильтрованную версию набора данных Собаки vs Кошки с сервиса Kaggle (в конце концов именно этот набор данных предоставляется Microsoft Research). В прошлом CoLab мы с вами использовали набор данных из самого TensorFlow Dataset модуля, который оказывается крайне удобным для работы и тестирования. В этом CoLab однако, мы воспользуемся классом
Набор данных, который мы загрузили, имеет следующую структуру:
Чтобы получить полный список директорий можно воспользоваться следующей командой:
В результате получим нечто подобное:
Теперь присвоим переменным корректные пути к директориям с наборами данных для тренировки и валидации:
Разбираемся с данными и их структурой Давайте посмотрим сколько же у нас изображений кошек и собак в тестовом и валидационном наборах данных (директориях).
Вывод последнего блока будет следующим:
Установка параметров модели Для удобства мы вынесем установку переменных, которые нам понадобятся для дальнейшей обработки данных и тренировки модели, в отдельное объявление:
Подготовка данных Перед тем как изображения могут быть использованы в качестве входных данных для нашей сети их необходимо преобразовать к тензорам со значениями с плавающей запятой. Список шагов, которые необходимо предпринять для этого:
К счастью все эти операции могут быть выполнены с использованием Всё это мы можем сделать с использованием нескольких строк кода:
После того как мы определили генераторы для набора тестовых и валидационных данных, метод flow_from_directory загрузит изображения с диска, нормализует данные и изменит размер изображений — всего лишь одной строкой кода:
Вывод:
Генератор по валидационным данным:
Вывод:
Визуализируем изображения из тренировочного набора Мы можем визуализировать изображения из тренировочного набора данных воспользовавшись
Функция
Пример вывод (2 изображения вместо всех 5): Создание модели Описываем модель Модель состоит из 4 блоков свёртки после каждого из которых следует блок со слоем подвыборки. Далее у нас идёт полносвязный слой с 512 нейронами и функцией активации
Компилирование модели Как и ранее мы воспользуемся оптимизатором
Представление модели Давайте взглянем на структуру нашей модели по уровням используя метод summary:
Вывод:
Тренировка модели Настала пора тренировки модели! Так как обучающие блоки будут поступать из генератора (
Визуализация результатов тренировки Теперь мы визуализируем результаты тренировки нашей модели:
Вывод: Как можно заметить на графиках, точность на тренировочном и валидационном наборах данных различаются на достаточно большое значение и наша модель достигла всего лишь 70% точности на валидационном наборе данных (зависит от количества обучающих итераций). Это является очевидным свидетельством переобучения. Как только кривые обучения и валидации начинают расходиться это значит, что модель начинает запоминать тренировочные данные и плохо отрабатывать на валидационном наборе данных. Продолжение следует… в новой публикации. … и стандартные call-to-action — подписывайся, ставь плюс и делай share :) Источник: habr.com Комментарии: |
|