Погружение в свёрточные нейронные сети: передача обучения (transfer learning) |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-09-28 12:15 Полный курс на русском языке можно найти по этой ссылке. Оригинальный курс на английском доступен по этой ссылке. Содержание
Интервью с Себастьяном Труном
— Это 6 урок и он полностью посвящён передаче обучения (transfer learning). Передача обучения это процесс использования существующей модели с небольшими доработками для новых задач. Передача обучения помогает сократить время обучения модели давая некоторый прирост эффективности при обучении в самом начале. Себастьян, а что же вы думаете про передачу обучения? Удавалось ли вам когда-либо использовать методику передачи обучения в своих работах и исследованиях? Введение
— Привет и с возвращением! Передача модели обучения
В 2012 году нейронная сеть AlexNet произвела переворот в мире машинного обучения и популяризовала использование свёрточных нейронных сетей для классификации выиграв соревнование ImageNet Large Scale Visual recognition challenge. После этого началась борьба за разработку более точных и эффективных нейронных сетей, которые могли бы превзойти AlexNet в задачах классификации изображений из набора данных ImageNet. В течение нескольких лет были разработаны нейронные сети, которые справлялись с задачей классификации лучше, чем AlexNet — Inception и ResNet. Оказывается, что мы можем это сделать! Методика называется transfer learning (передача модели обучения). Основная идея метода передачи модели обучения основывается на том, что обучив нейронную сеть на большом наборе данных мы можем применить полученную модели и к набору данных, который раньше эта модель ещё не встречала. Именно поэтому методика называется transfer learning — передача процесса обучения с одного набора данных на другой. Для того, чтобы мы могли применить методику передачи модели обучения нам понадобится изменить последний слой нашей свёрточной нейронной сети: Мы выполняем эту операцию потому, что каждый набор данных состоит из различного количества выходных классов. Например, наборы данных в ImageNet содержат 1000 различных выходных классов. FashionMNIST содержит 10 классов. Наш набор данных для классификации состоит лишь из 2 классов — кошки и собаки. Именно поэтому необходимо изменить последний слой нашей свёрточной нейронной сети, чтобы он содержал то количество выходов, которое бы соответствовало количеству классов в новом наборе. Так же нам необходимо убедиться, что мы не изменим заранее обученную модель во время процесса тренировки. Решение заключается в отключении переменных предобученной модели — мы просто запретим алгоритму обновляющему значения при прямом и обратно распространении их менять. "Замораживая" параметры предобученной модели мы позволяем обучаться только последнему слою сети классификации, значения переменных предобученной остаются неизменными. Ещё одно неоспоримое преимущество предобученных моделей заключается в том, что мы сокращаем время обучения тренируя только последний слой со значительно меньшим количеством переменных, а не всю модель. Если мы не "заморозим" переменные предобученной модели, то в процессе обучения на новом наборе данных значения переменных будут меняться. Это происходит потому, что значения переменных на последнем слое классификации будут заполненны случайными значениями. Из-за случайных значений на последнем слое наша модель будет допускать большие ошибки в классификации, что, в свою очередь, повлечёт сильные изменения исходных весов в предобученной модели, что крайне нежелательно для нас. Именно по этой причине мы всегда должны помнить о том, что при использовании существующих моделей значения переменных стоит "замораживать" и отключать необходимость обучения предобученной модели. Теперь, когда мы знаем как работает передача модели обучения, нам осталось выбрать предобученную нейронную сеть для применения в собственном классификаторе! Этим мы займёмся в следующей части. MobileNet
Как мы уже упоминали ранее, были разработаны крайне эффективные нейронные сети, которые показывали высокие результаты на наборах данных ImageNet — AlexNet, Inception, Resonant. Эти нейронные сети представляют собой очень глубокие сети и содержит в себе тысячи и даже миллионы параметров. Большое количество парамеров позволяет сети обучиться более сложным паттернам и тем самым добиться повышенной точности классификаций. Большое количество обучающих параметров нейронной сети сказывается на скорости обучения, количестве требуемой памяти для хранения сети и сложности производимых вычислений. В этом уроке мы воспользуемся современной свёрточной нейронной сетью MobileNet. MobileNet представляет собой эффективную архитектуру свёрточной нейронной сети, которая уменьшает количество используемой памяти для вычислений сохраняя при этом высокую точность предсказаний. Именно поэтому MobileNet является идеальным вариантом для использования на мобильных устройствах с ограниченным количеством памяти и вычислительных ресурсов. MobileNet была разработана в компании Google и обучена на наборе данных ImageNet. Так как MobileNet была обучена на 1 000 классах из набора данных ImageNet, то у MobileNet 1 000 выходных классов, вместо двух, которые нам нужны — кошка и собака. Для выполнения передачи обучения мы предварительно загрузим вектор признаков без слоя классификации: В Tensorflow загруженный вектор признаков может быть использован как обычный Keras-слой с входными данными определённого размера. Так как MobileNet была обучена на наборе данных ImageNet, то нам необходимо будет привести размер входных данных к тем, которые были использованы в процессе обучения. В нашем случае MobileNet была обучена на RGB-изображениях фиксированного размера 224х224px. TensorFlow содержит в себе репозиторий с предобученными моделями, который называется TensorFlow Hub. TensorFlow Hub содержит некоторые предобученные модели в которых последний слой классификации был исключён из архитектуры нейронной сети для последующего переиспользования. Использовать TensorFlow Hub в коде можно в несколько строк: Достаточно указать URL вектора признаков нужной обучающей модели и затем встроить модель в наш классификатор с указанием последнего слоя с нужным количеством выходных классов. Именно последний слой и будет подвергнут обучению и изменению значений параметров. Компиляция и тренировка нашей новой модели осуществляется таким же образом, как мы делали это раньше: Давайте посмотрим каким образом это будет работать на самом деле и напишем соответствующий код. CoLab: Кошки Vs Собаки с передачей обучения
Ссылка на CoLab на русском и CoLab на английском. TensorFlow Hub представляет собой репозиторий с предобученными моделями, которые мы с вами можем использовать. Передача обучения это процесс в котором мы берём заранее предобученную модель и расширяем её для выполнения определенной задачи. При этом часть предобученной модели, которую мы интегрируем в нейронную сеть, мы оставляем нетронутой, а лишь обучаем последние выходные слои для получения нужного результата. В этой практической части мы протестируем оба варианта. По этой ссылке можно изучить весь перечень доступных моделей. В этой части Colab
Перед тем как приступать к выполнению текущей практической части рекомендуем сбросить настройки окружения Импорты библиотек В этой практической части мы будем использовать ряд возможностей библиотеки TensorFlow, которых ещё нет в официальном релизе. Именно поэтому мы сперва установим версию TеnsorFlow и TensorFlow Hub для разработчиков. Установка dev-версии TensorFlow автоматически активирует последнюю установленную версию. После того как мы закончим разбираться с этой практической частью, то рекомендуем восстановить настройки TensorFlow и вернуться к стабильной версии через пункт меню
Вывод:
Некоторые импорты мы уже с вами видели и использовали раньше. Из нового — импорт
Вывод:
Часть 1: используем TensorFlow Hub MobileNet для предсказаний В этой части CoLab мы возьмём предобученную модель, загрузим её в Keras и протестируем. Модель, которую мы используем — MobileNet v2 (вместо MobileNet может быть использована любая другая совместимая с tf2 модель классификатора изображений с tfhub.dev). Загрузите классификатор Загрузите MobileNet-модель и создайте из неё Keras-модель. MobileNet на входе ожидает получить изображение размером 224х224 пикселя с 3 цветовыми каналами (RGB).
Запустите классификатор на единственном изображении MobileNet была обучена на наборе данных ImageNet. ImageNet содержит 1000 выходных классов и один из таких классов — военная форма. Давайте найдём изображение на котором будет находиться военная форма и которая не будет являться частью обучающего набора ImageNet для проверки точности классификации.
Вывод:
Вывод:
Имейте ввиду, что модели всегда на входе получают набор (блок) изображений для обработки. В коде ниже мы добавляем новую размерность — размер блока.
Вывод:
Результатом предсказания стал вектор размером 1 001 элемент, где каждое значение представляет собой вероятность принадлежности объекта на изображении определенному классу. Позиция максимаьного значения вероятности может быть найдена при помощи функции
Вывод:
Расшифровываем предсказания Для того чтобы мы могли определить класс к которому относится предсказания загрузим список меток ImageNet и по индексу с максимальной веростностью определим класс к которому относится предсказание.
Вывод:
Бинго! Наша модель корректно определила военную форму. Часть 2: используйте TensorFlow Hub-модель для набора данных кошек и собак Сейчас мы воспользуемся полной версией модели MobileNet и посмотрим, каким образом она справится с набором данных кошек и собак. Набор данных Мы можем воспользоваться TensorFlow Datasets для загрузки набора данных кошек и собак.
Вывод:
Не все изображения в наборе данных кошек и собак одного размера.
Вывод:
Поэтому изображения из полученного набора данных требуют приведения к единому размеру, который ожидает на входе модель MobileNet — 224 x 224. Функция
Запустите классификатор на наборах изображений Напомню, что на данном этапе у на всё ещё полная версия предобученной MobileNet сети, которая содержит 1 000 возможных выходных классов. ImageNet содержит большое количество изображений собак и кошек, поэтому давайте попробуем подать на вход одно из тестовых изображений из нашего набора данных и посмотреть, какое предсказание нам выдаст модель.
Вывод:
Метки похожи на названия пород кошек и собак. Давайте теперь отобразим несколько изображений из нашего набора данных кошек и собак и над каждым из них разместим предсказанную метку.
Часть 3: реализуйте передачу обучения с TensorFlow Hub Теперь давайте воспользуемся TensorFlow Hub для передачи обучения от одной модели к другой. В процессе передачи обучения мы переиспользуем одну предобученную модель изменяя её последний слой, или несколько слоёв, а затем снова запускаем процесс обучения на новом наборе данных. В TensorFlow Hub можно найти не только полные предобученные модели (с последним слоем), но и модели без последнего классификационного слоя. Последние могут быть с легкостью использованы для передачи обучения. Мы продолжим использовать MobileNet v2 по той простой причине, что в последующих частях нашего курса мы перенесём эту модель и запустим её на мобильном устройстве с помощью TensorFlow Lite. Мы так же продолжим использовать набор данных кошек и собак, таким образом у нас будет возможность сравнить производительность этой модели с теми, которые мы реализовывали с нуля. Обратите внимание, что частичную модель с TensorFlow Hub (без последнего классификационного слоя) мы назвали
Давайте прогоним через
Вывод:
"Заморозим" переменные в слое извлечения свойств для того, чтобы в процессе обучения менялись только значения переменных слоя классификации.
Добавьте слой классификации Теперь оберните слой из TensorFlow Hub в
Вывод:
Обучите модель Теперь мы обучаем полученную модель так, как мы делали это раньше вызывая
Вывод:
Как вы уже наверняка обратили внимание мы смогли добиться ~97% точности предсказаний на валидационном наборе данных. Потрясающе! Текущий подход значительно увеличил точность классификации в сравнении с первой моделью, которую мы обучали сами и получили точность классификации ~87%. Причина заключается в том, что MobileNet была спроектирована экспертами и тщательно дорабатывалась в течение длинного периода времени, а затем обучена на невероятно большом массиве данных ImageNet. Как создать собственную MobileNet в Keras можно посмотреть по этой ссылке. Давайте построим графики изменения значений точности и потерь на обучающем и валидационном наборах данных.
Что интересно здесь, так это то, что результаты на валидационном наборе данных лучше результатов на обучающем наборе данных с самого начала до самого конца процесса обучения. Одна из причин такого поведения заключается в том, что точность на валидационном наборе данных измеряется в конце обучающей итерации, а точность на тренировочном наборе данных считается как среднее значение среди всех обучающих итераций. Большей причиной такого поведения является использование предобученной под-сети MobileNet, которая ранее была обучена на большом наборе данных кошек и собак. В процессе обучения наша сеть по прежнему выполняет расширение входного набора тренировочных данных (ту самую augmentation), но не валидационного набора. Это значит что сгенерированные изображения на тренировочном наборе данных сложнее классифицировать чем нормальные изображения из валидационного набора данных. Проверьте результаты предсказаний Чтобы повторить график из предыдущего раздела для начала необходимо получить отсортированный список наименований классов:
Вывод:
Пропустите блок с изображениями через модель и преобразуйте полученные индексы в имена классов:
Вывод:
Давайте взглянем на истинные метки и предсказанные:
Вывод:
Погружаемся в свёрточные нейронные сети
Используя свёрточные нейронные сети мы успели убедиться, что они хорошо справляются с задачей классификации изображений. Однако, на данный момент, мы с трудом представляем себе каким образом они действительно работают. Если бы мы могли понять, каким образом происходит процесс обучения то, в принципе, могли бы улучшить работу по классификации ещё больше. Один из способов понять, каким образом работают свёрточные нейронные сети, заключается в визуализации слоёв и результатов их работы. Мы настоятельно рекомендуем вам изучить материалы по ссылке, чтобы лучше понять, каким образом визуализировать результаты работы свёрточных слоёв. Область компьютерного зрения увидела свет в конце тонеля и сильно продвинулась вперёд со времён появления свёрточных нейронных сетей. Невероятная скорость с которой осуществляются исследования в этой области и огромные массивы изображений опубликованных в интернете дали невероятные результаты за прошедшие несколько лет. Восход свёрточных нейронных сетей начался с AlexNet в 2012 году, которая была создана Алексом Крижевски, Ильёй Сутскевером и Джеффри Хинтоном и выиграла в известном соревновании ImageNet Large-Scale Visual Recognition Challenge. C тех пор не возникало никаких сомнений в светлом будущем с использованием свёрточных нейронных сетей, а область компьютерного зрения и результаты работы в ней только подтверждали этот факт. Начиная с распознавания вашего лица на мобильном телефоне и заканчивая распознаванием объектов в автономных автомобилях, свёрточные нейронные сети уже успели показать и доказать свою силу и решить множество проблем из реального мира. Несмотря на огромное количество больших наборов данных и предобученных моделей свёрточных нейронных сетей иногда крайне сложно разобраться в том, каким образом работает сеть и чему именно эта сеть обучается, особенно для людей у которых нет достаточных знаний в области машинного обучения. Изучение базовой информации по статистике и вероятности помогает преодолеть некоторые трудности в понимании работы свёрточных нейронных сетей, однако стоит делу дойти до отладки разрабатываемой и тестируемой свёрточной нейронной сети, например, такой как Inception, то многие сдаются. Цель большинства людей сводится к использованию заранее предобученных моделей для классификации изображений или решению любой другой задачи с получением конечного результата. Меньше всего таким людям хочется погружаться в детали работы свёрточной нейронной сети, несмотря на тот факт, что подобное погружение может сказать им многое о том, как их сеть обучается и чему именно она обучается, а так же где нужно искать ошибки при отладке. Недавно я наткнулся на потрясающую книгу "Глубокое обучение на Python" от Погружаясь в визуализацию Визуализация выходных значений модели машинного обучения отличный способ представить себе и увидеть, каким образом обучается модель, будь то модель на основе дерева решений или большая нейронная сеть. В процессе тренировки большинство пользователей модели заинтересованы только в ошибке на тренировочном (training accuracy) и на валидационном наборах данных. Безусловно эти два параметра крайне важны для понимания того, как проходит процесс обучения и в какую сторону он движется, однако когда речь заходит о свёрточных нейронных сетях, например, таких как Inception, то появляется столько возможностей для визуализации результатов обучение и тем самым лучшего понимания архитектуры самой сети. В этой части я продемонстрирую несколько способов визуализации выходных значений модели, которые позволят получить лучшее представление о том, как происходит сама работа внутри модели. Я обучил Inception v3 (предобученная версия на наборе данных ImageNet) на наборе данных с цветами, который доступен на Kaggle. Если вам ранее не приходилось сталкиваться с моделью Inception, то я настоятельно рекомендую ознакомиться с исходной статьёй по архитектуре сети, а затем изучить второй документ про архитектуру Inception v3 для понимания теоретической части архитектуры сети. Я обучил модель за 10 итераций (эпох) с размером обучающего блока 32 изображения, размер каждого изображения 229х229х3. Моя модель смогла достигнуть значения потерь на тренировочном наборе данных 0.3195, на валидационном наборе данных — 0.6377. Я использовал встроенный класс Визуализация промежуточных слоёв Чтобы лучше понять работу глубоких свёрточных сетей при классификации изображений нам необходимо понять, каким образом модель "видит" наши входные изображения, глядя на выходные значения промежуточных слоёв. Изучая выходные результаты модели на промежуточных слоях мы станем лучше понимать сам принцип их работы. Например, ниже представлены визуализации некоторых значений промежуточных слоёв свёртки с соответствующими активационными слоями обученной Inception v3 модели, при подаче на вход оригинального изображения с цветком. Приведенные выше изображения — результаты работы промежуточных слоёв модели. Я получил их подавая на вход свёрточной нейронной сети одно из тестовых изображений. Если взглянуть на различные изображения результатов работы свёрточного слоя, то становится достаточно очевидным каким образом различные фильтры на разных слоях пытаются выделить (активировать) разные части изображения. Некоторые фильтры работают как фильтры определения границ (граней), другие определяют конкретную часть цветка на изображении, например, центральную часть, а другие выполняют роль детекторов фона. Легче всего заметить такое поведение свёрточных слоёв на начальных этапах, потому что чем глубже становится сеть, тем разряженнее становится ядро фильтров и некоторые признаки, которые выделены на начальных слоях, могут оказаться нерелевантными на последующих и отброшены. Возвращаемся к ReLU-активации для соответствующих свёрточных слоёв. Всё что они делают, так это применяют функцию Визуализируя результаты работы различных свёрточных слоёв подобным образом ключевой момент, который вы заметите, заключается в том, что чем глубже становится слой в нейронной сети, тем более специфичное свойство изображения выделяется, в то время как на начальных слоях происходит выделение обобщенных паттернов, таких как грани, текстуры, фон и т.п. Понимание этого момента крайне важно при использовании передачи обучения с предобученными моделями, заменяете ли вы часть собственной сети готовой моделью или всю модель целиком. Основная идея заключается в "заморозке" (отключении) наиболее ранних слоёв нейронной сети, потому что они уже были обучены и уже содержат информации о том, как выделить определенные свойства объекта, оставляя активными только последние слои на которых происходит сам процесс распознавания и классификации. Визуализируем фильтры свёрточных слоёв Ещё один способ лучше понять на что же "смотрят" свёрточные слои в сети это визуализировать их фильтры. Изучая каждый фильтр можно понять на какой паттерн будет реагировать и активироваться каждый из фильтров. Вот некоторые фильтры, которые я получил обучая Inveption V3 модель на наборе данных с цветами: После пристального изучения полученных изображений фильтров с различных свёрточных слоёв нейронной сети становится понятно, что именно они пытаются найти в изображении на входе. Паттерны, которые мы наблюдаем на самых первых словях представляют собой самые простые паттерны состоящие из прямых и других базовых фигур, что в очередной раз доказывает нам, что на начальных слоях происходит выделение базовых свойств изображения вроде границ, цветов и т.п. Но чем сильнее мы отдаляемся от начальных слоёв свёрточной сети, тем сложнее и абстрактнее становятся выделяемые паттерны, а именно они помогают обобщить свойства изображения и отличить один класс объекта от другого на изображениях. Именно поэтому мы видели несколько пустых фильтров на глубинных слоях свёрточной сети, потому что определенные фильтры не были активированы, другими словами, в изображении не было той информации в которой фильтры были "заинтересованы" (попросту говоря, изображение не соответствовало искомому паттерну фильтра). Визуализируем тепловую карту классов активации В процесс предсказания классов объектов на изображении, иногда наша модель будет ошибаться и предсказывать некорректные классы, например, вероятность правильной метки будет не максимальной. В подобных случаях будет крайне полезно, если бы мы смогли визуализировать области изображений в свёрточной сети на которые она смотрит для определения класса объекта. Подобная техника визуализации называется Class Activation Map (карта активаций класса). Один из техник применяемая при CAM это наложение тепловой карты на исходное изображение. Тепловая карта классов активации представляет собой 2D сетку в каждой ячейке которой располагается значение количества баллов связанных с конкретным выходным классом, вычисленное для каждой позиции исходного изображения и отображающего важность вклада каждого участка в классификацию объекта выходного класса. На приведённых выше изображениях вы можете понять, каким образом работает эта техника. Начиная с левого изображения, изображение подаваемое на вход, затем идёт изображение тепловой карты активаций последнего Mixed-слоя в Inception V3-модели, последнее изображение наложение исходного и тепловой карты активаций. Таким образом карта активаций сообщает нам область (участок) изображения, которая произвела максимальный вклад в конечное значение классификации полученного выходного класса. На первом изображении достаточно очевидно, что трудностей с классификацией наша свёрточная нейронная сеть не наблюдает, так как на изображении больше нет других объектов. На следующем изображении свёрточная нейронная сеть не смогла классифицировать ромашки, но достаточно взглянуть на тепловую карту активаций и становится понятным тот факт, что сеть ищет объект в нужной части изображения. То же относится и к последнему изображению, где сеть корректно определяет участок изображения на котором находятся ромашки. Несмотря на то, что сети не удалось корректно определить ромашки на последних двух изображениях она определила их местоположение на изображении, и дело здесь не в корректности самой сети, а скорее в том, что большую часть исходного изображения занимают другие объекты. Тепловые карты активаций могут отличаться в зависимости от слоёв свёрточной сети, так как каждый свёрточные слой "видит" изображение по-своему и создаёт собственную уникальную абстракцию изображения основываясь на сгенерированных фильтрах. В этом примере я сконцентрировался на последнем слое модели от которого непосредственно зависит точность классификации. Однако в качестве хорошего эксперимента можно сравнить тепловые карты активации на различных слоях. В заключение хочу добавить, что визуализация позволяет нам лучше понять происходящее в свёрточной нейронной сети, найти причины ошибочных классификаций и даёт нам возможность повысить эффективность работы сети понимания работу и результаты работы каждого слоя. Практическая часть: определение цветов с передачей обучения
Colab на русском и Colab на английском. TensorFlow Hub TensorFlow Hub представляет собой репозиторий с предобученными моделями, которые мы с вами можем использовать. Передача обучения это процесс в котором мы берём заранее предобученную модель и расширяем её для выполнения определенной задачи. При этом часть предобученной модели, которую мы интегрируем в нейронную сеть, мы оставляем нетронутой, а лишь обучаем последние выходные слои для получения нужного результата. По этой ссылке можно изучить весь перечень доступных моделей. Перед тем как приступать к выполнению текущей практической части рекомендуем сбросить настройки окружения Импорты Импортируем библиотеки, которые мы использовали ранее:
Вывод:
Загрузите набор данных с цветами используя TensorFlow Datasets В коде ниже мы с вами загрузим набор данных цветов из TensorFlow Datasets. Если посмотреть в документации, то найдём название этого набора данных —
Вывод:
Выведите информацию о цветочном наборе данных Теперь, когда мы загрузили набор данных цветов, воспользуемся полученной информацией (метаданными) по набору данных и выведем количество классов в наборе, а так же напишем часть кода, который покажет нам сколько элементов в каждом из наборов — тренировочном и валидационном.
Вывод:
Изображения в цветочном наборе данных различного размера — надо исправлять.
Вывод:
Преобразовываем изображения и создаём блоки обработки В коде ниже мы приводим изображения к единому размеру — размеру, который используется MobilNet v2 на входе для классификации — 224х224 и нормализуем значения пикселей (grayscale). Функция принимает на входе
Применяем передачу обучения с TensorFlow Hub Давайте теперь воспользуемся TensorFlow Hub для передачи обучения. Напомним, что при передаче обучения мы переиспользуем части предобученной модели в нашей модели и связываем с последним слоем классификации или несколькими слоями модели, а затем обучаем всю модель на обучающем наборе данных. Создаём метод извлечения свойств В коде ниже мы создаём
Замораживаем переменные предобученной модели В коде ниже мы блокируем возможность изменения значений переменных предобученной модели и оставляем возможность обучаться только последнему слою классификации, который мы добавим:
Добавляем слой классификации В коде ниже мы добавляем последний слой классификации с количеством нейронов равных количеству классифицируемых классов, которые нам необходимы. Количество выходных нейронов должно быть равно количеству классов в цветочном наборе данных. В последней строке мы выводим информации о полученной архитектуре модели.
Вывод:
Обучаем модель В коде ниже мы компилируем и тренируем полученную модель таким же образом, как делали это раньше с полностью созданными нами свёрточными нейронными сетями.
Вывод:
Как вы уже обратили внимание мы получили точность ~90% после 6 обучающих итераций, что можно назвать отличным результатом! Это потрясающая точность, если учитывать тот факт, что на созданной нами модели с нуля мы получили точность ~76% после 80 обучающих итераций. Существенная разница в точности классификации объясняется тем фактом, что MobilNet v2 была спроектирована и тщательно дорабатывалась множеством экспертов в области и обучена была на огромном наборе данных. Отобразите графики точности потерь на тренировочном и валидационном наборах данных В коде ниже мы отрисовываем графики точности и потерь на тренировочном и валидационном наборах данных.
Что интересно здесь, так это то, что результаты на валидационном наборе данных лучше результатов на обучающем наборе данных с самого начала до самого конца процесса обучения. Одна из причин такого поведения заключается в том, что точность на валидационном наборе данных измеряется в конце обучающей итерации, а точность на тренировочном наборе данных считается как среднее значение среди всех обучающих итераций. Большей причиной такого поведения является использование предобученной под-сети MobileNet, которая ранее была обучена на большом наборе данных кошек и собак. В процессе обучения наша сеть по прежнему выполняет расширение входного набора тренировочных данных (ту самую augmentation), но не валидационного набора. Это значит что сгенерированные изображения на тренировочном наборе данных сложнее классифицировать чем нормальные изображения из валидационного набора данных. Проверим предсказания В коде ниже мы получаем список наименований классов и преобразуем его в массив NumPy. Выводим в консоль значения массива, чтобы убедиться в корректности наименований меток.
Вывод:
Сформируем блок изображений и прогоним через модель для предсказаний Воспользуемся функцией
Вывод:
Выведем истинные метки и предсказанные индексы
Вывод:
Отобразим предсказания модели
Осуществляем передачу обучения с использованием Inception-модели Обратимся снова к документации TensorFlow Hub и перейдём в раздел
Вывод:
Вывод:
Итоги
В этом уроке мы с вами научились использовать передачу обучения для создания мощных свёрточных нейронных сетей с минимальными усилиями. Ключевые момент о которых мы говорили и которые стоит помнить:
Так же мы использовали передачу обучения для создания свёрточной нейронной сети на основе MobileNet для классификации изображений кошек и собак. Вы наверняка смогли убедиться насколько сильно повышается точность классификации при использовании технологии передачи обучения на наборе данных с кошками и собаками. В качестве упражнения мы с вами применили технологию передачи обучения для создания собственной свёрточной нейронной сети на основе MobileNet для классификации изображений цветов. … и стандартные call-to-action — подписывайся, ставь плюс и делай share :) Источник: habr.com Комментарии: |
|