Практическое трансферное обучение с использованием Keras и модели VGG16 |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-03-06 14:34 В предыдущей статье мы представили основы классификации изображений с помощью Keras , где мы создали CNN для классификации изображений еды. Наша модель показала себя не очень хорошо, но мы можем значительно повысить точность, не тратя много времени на обучение, используя концепцию под названием Transfer Learning. К концу этой статьи вы сможете:
Давайте начнем. Что такое трансферное обучение? В предыдущей статье мы определили нашу собственную сверточную нейронную сеть и обучили ее на наборе данных изображений продуктов питания. Мы увидели, что производительность этой модели, созданной с нуля, была резко ограничена. Эта модель должна была сначала научиться обнаруживать общие особенности на изображениях, такие как края и цветные пятна, прежде чем обнаруживать более сложные особенности. В реальных приложениях для достижения высокой производительности могут потребоваться дни обучения и миллионы изображений. Нам было бы проще загрузить общую предварительно обученную модель и переобучить ее на нашем собственном наборе данных. Вот что влечет за собой трансферное обучение. Таким образом, трансферное обучение — это подход, при котором мы используем одну модель, обученную для выполнения задачи машинного обучения, и повторно используем ее в качестве отправной точки для другой работы. Этот подход используется во многих областях глубокого обучения, включая классификацию изображений, обработку естественного языка и даже игры! Возможность адаптировать обученную модель под другую задачу невероятно ценна. Обзор CNN В этом руководстве предполагается, что вы имеете представление о сверточных нейронных сетях. Если вы хотите более подробно изучить эти сети, прочтите нашу предыдущую статью. В этом разделе мы рассмотрим строительные блоки CNN. Не стесняйтесь пропустить реализацию Python. Архитектура сверточной нейронной сети Рис. 1. Графическое представление архитектуры CNN. Напомним, что архитектура CNN содержит некоторые важные строительные блоки, такие как: 1. Сверточный слой:
2. Слой ReLu (активация):
3. Уровень объединения:
4. Полносвязный слой:
Написание моделей такого типа с нуля может быть невероятно сложным, особенно если у нас нет набора данных достаточного размера. Модель CNN, которую мы обсудим позже в этой статье, была предварительно обучена на миллионах фотографий! Мы рассмотрим, как можно использовать предварительно обученную архитектуру для решения нашей задачи пользовательской классификации. Прогнозирование этикеток продуктов питания с помощью Keras CNN Изначально мы написали простую CNN с нуля. Мы загрузим ту же модель, что и раньше, чтобы сгенерировать некоторые прогнозы и рассчитать ее точность, которая будет использоваться для сравнения производительности новой модели с использованием трансферного обучения.
Вне:
Наша CNN, созданная с нуля, имеет относительно простую архитектуру: 7 сверточных слоев, за которыми следует один плотносвязный слой. Используя старую CNN для расчета показателя точности (подробности о котором вы можете найти в предыдущей статье ), мы обнаружили, что у нас показатель точности составляет ~58% . С таким показателем точности CNN, созданная с нуля, работает в лучшем случае умеренно хорошо. Мы могли бы повысить точность с помощью набора обучающих данных достаточного размера, которого у нас нет. На практике вам следует писать CNN с нуля, только если у вас большой набор данных. В этом уроке мы загрузим предварительно обученную модель и повторно обучим ее на нашем собственном наборе данных, чтобы создать лучшую модель. Как работает трансферное обучение? Трансферное обучение частично устраняет ограничения парадигмы изолированного обучения : «В настоящее время доминирующей парадигмой МО является запуск алгоритма МО на заданном наборе данных для создания модели. Затем модель применяется в реальных задачах. Мы называем эту парадигму изолированным обучением, потому что она не учитывает какую-либо другую связанную информацию или знания, полученные в прошлом». ( Лю, 2016 ) Трансферное обучение дает нам возможность использовать изученные функции в различных учебных задачах. Домены и задачи Мы можем понимать трансферное обучение с точки зрения областей и задач . В нашем случае областью деятельности является классификация изображений, а наша задача — классифицировать изображения продуктов питания. Как и раньше, запуск с нуля потребует множества оптимизаций, большего количества данных и более длительного обучения для повышения производительности. Если мы используем CNN, которая уже оптимизирована и обучена для аналогичной области и задачи, мы можем преобразовать ее для работы с нашей задачей. Именно этого и добивается трансферное обучение. Мы будем использовать предварительно обученную модель VGG16, которая представляет собой сверточную нейронную сеть, обученную на 1,2 миллионах изображений для классификации 1000 различных категорий. Поскольку домен и задача для VGG16 аналогичны нашему домену и задаче, мы можем использовать его предварительно обученную сеть для выполнения этой работы. Подробности о более математическом определении см. в статье Улучшение классификации эмоций на основе ЭЭГ с использованием обучения с условным переносом . Использование предварительно обученных сверточных слоев Наш подход к трансферному обучению будет включать использование слоев, предварительно обученных на исходной задаче, для решения целевой задачи . Обычно мы загружаем некоторую предварительно обученную модель и «отрезаем» ее верхнюю часть (полностью связный слой), оставляя нам только сверточные слои и слои пула. Используя предварительно обученные слои, мы извлечем визуальные функции из нашей целевой задачи/набора данных . При использовании этих предварительно обученных слоев мы можем решить заморозить обучение определенных слоев. Мы будем использовать предварительно обученные веса по мере их поступления и не обновлять их с помощью обратного распространения ошибки. В качестве альтернативы мы можем заморозить большинство предварительно обученных слоев, но разрешить другим слоям обновлять свои веса, чтобы улучшить классификацию целевых данных . Как использовать модель VGG16 VGG16 — это сверточная нейронная сеть, обученная на подмножестве набора данных ImageNet , коллекции из более чем 14 миллионов изображений, относящихся к 22 000 категориям. К. Симоньян и А. Зиссерман предложили эту модель в статье 2015 года « Очень глубокие сверточные сети для крупномасштабного распознавания изображений ». В конкурсе ImageNet Classification Challenge 2014 года VGG16 достиг точности классификации 92,7%. Но что еще более важно, он был обучен на миллионах изображений. Его предварительно обученная архитектура может обнаруживать общие визуальные особенности, присутствующие в нашем наборе данных о продуктах питания. Рис. 2. Модель VGG16 имеет 16 сверточных слоев и слоев максимального пула, 3 плотных слоя для полностью связанного слоя и выходной слой из 1000 узлов. Теперь предположим, что у нас есть много изображений двух типов автомобилей: спортивных автомобилей Ferrari и легковых автомобилей Audi. Мы хотим создать модель, которая сможет классифицировать изображение как один из двух классов. Написание собственной CNN не является вариантом, поскольку у нас нет достаточного по размеру набора данных. Вот тут-то и приходит на помощь трансферное обучение! Мы знаем , что набор данных ImageNet содержит изображения различных транспортных средств (спортивных автомобилей, пикапов, минивэнов и т. д.). Мы можем импортировать модель, предварительно обученную на наборе данных ImageNet, и использовать ее предварительно обученные слои для извлечения признаков. Теперь мы не можем использовать всю архитектуру предварительно обученной модели. Слой Fully-Connected генерирует 1000 различных выходных меток, тогда как наш целевой набор данных имеет только два класса для прогнозирования. Итак, мы импортируем предварительно обученную модель, такую как VGG16 , но «отрежем» слой Fully-Connected, также называемый «верхней» моделью. После импорта предварительно обученных слоев, за исключением «верхней части» модели, мы можем использовать один из двух подходов к трансферному обучению. 1. Подход к извлечению функций В этом подходе мы используем архитектуру предварительно обученной модели для создания нового набора данных из наших входных изображений. Мы импортируем слои Convolutional и Pooling, но оставим «верхнюю часть» модели (полностью связанный слой). Напомним, что наша модель VGG16 была обучена на миллионах изображений, включая изображения транспортных средств. Его сверточные слои и обученные веса могут обнаруживать общие функции, такие как края, цвета, колеса, лобовые стекла и т. д. Мы пропустим наши изображения через сверточные слои VGG16, которые выведут стек обнаруженных визуальных функций. Отсюда легко объединить трехмерный стек функций в массив NumPy, готовый к любому моделированию, которое вы предпочитаете проводить. Рис. 3. На рисунке выше показана удаленная «верхняя» часть модели. Модель свертывает предварительно обученные выходные слои в виде трехмерного стека карт объектов. Мы можем выполнить извлечение признаков следующим образом:
В этой статье будет показано, как реализовать «загрузочное» извлечение данных изображения с помощью VGG16 CNN. Предварительно обученные слои будут свертывать данные изображения в соответствии с весами ImageNet. Мы загрузим полностью связанный слой для генерации прогнозов. 2. Подход тонкой настройки В этом подходе мы используем стратегию под названием «Точная настройка» . Цель тонкой настройки — позволить части предварительно обученных слоев переобучиться. В предыдущем подходе мы использовали предварительно обученные слои VGG16 для извлечения признаков. Мы передали наш набор данных изображений через сверточные слои и веса, выведя преобразованные визуальные функции. Фактического обучения на этих предварительно обученных слоях не проводилось. Точная настройка предварительно обученной модели включает в себя:
Замороженные предварительно обученные слои будут свертывать визуальные элементы, как обычно. Незамороженные (т. е. «обучаемые») предварительно обученные слои будут обучаться на нашем пользовательском наборе данных и обновляться в соответствии с прогнозами полностью связанного слоя. Рис. 4. В приведенном выше графическом представлении окончательные слои свертки и объединения разморожены, чтобы обеспечить возможность обучения. Полностью подключенный уровень определен для обучения и прогнозирования. В этой статье мы покажем, как реализовать тонкую настройку на CNN VGG16. Мы загрузим некоторые предварительно обученные слои как «обучаемые», пропустим данные изображения через предварительно обученные слои и «точно настроим» обучаемые слои вместе с нашим полностью подключенным слоем. Загрузка набора данных Прежде чем мы продемонстрируем любой из этих подходов, убедитесь, что вы загрузили данные для этого руководства. Чтобы получить доступ к данным, используемым в этом руководстве, ознакомьтесь со статьей «Классификация изображений с помощью Keras» . В этом разделе вы можете найти команды терминала и функции для разделения данных . Если вы начинаете с нуля, обязательно запустите Использование трансферного обучения для классификации продуктов питания Предварительно обученные модели, такие как VGG16, легко загружаются с помощью API Keras. Мы продолжим использовать VGG16 для обучения, но вам следует изучить и другие доступные модели! Многие из них прошли обучение на наборе данных ImageNet и имеют свои преимущества и недостатки. Список доступных моделей вы можете найти здесь .
Модель VGG16 была обучена на данных, в которых значения пикселей находились в диапазоне от Другие модели имеют другие схемы нормализации, подробности о которых можно найти в их документации. Некоторые модели требуют масштабирования числовых значений в диапазоне (-1, +1). Подготовка данных для обучения и тестирования Давайте сначала импортируем некоторые необходимые библиотеки.
В предыдущей статье мы определили генераторы изображений ( см. здесь ) для нашего конкретного случая использования. Теперь нам нужно будет использовать функцию предварительной обработки VGG16 для данных нашего изображения.
С помощью нашего ImageDataGenerator мы теперь можем
Вне:
Использование предварительно обученных слоев для извлечения признаков В этом разделе мы покажем, как выполнить трансферное обучение без тонкой настройки предварительно обученных слоев. Вместо этого мы сначала будем использовать предварительно обученные слои для обработки нашего набора данных изображений и извлечения визуальных функций для прогнозирования. Затем мы создаем полносвязный слой и выходной слой для нашего набора данных изображений. Наконец, мы обучим эти слои с помощью обратного распространения ошибки. В функции вы увидите
Вот
Обучение без тонкой настройки Теперь мы определим параметры аналогично первой статье, но с большей формой ввода. Дальше создадим модель без доработок:
Наша скомпилированная модель содержит предварительно обученные веса и слои VGG16. В данном случае мы выбрали параметр set Эта модель будет выполнять извлечение признаков с использованием замороженных предварительно обученных слоев и обучать полностью связанный слой для прогнозирования. Дополнительную информацию об используемых обратных вызовах и параметрах подгонки см. в этом разделе предыдущей статьи.
Теперь мы можем обучить модель, определенную выше:
РЕЗУЛЬТАТ: Вне:
Вне:
Использование предварительно обученных слоев для точной настройки Ух ты! Какое улучшение по сравнению с нашим пользовательским CNN! Интеграция предварительно обученных слоев VGG16 с инициализированным полностью подключенным слоем позволила достичь точности 73% ! Но как мы можем добиться большего? В следующем разделе мы перекомпилируем модель, но разрешим обратное распространение ошибки для обновления двух последних предварительно обученных слоев. Вы заметите, что мы скомпилировали эту модель точной настройки с более низкой скоростью обучения, что поможет полностью связанному слою «разогреться» и изучить ранее изученные надежные шаблоны, прежде чем выделять более мелкие детали изображения. Как и прежде, мы инициализируем наш полностью связанный слой и его веса для обучения.
РЕЗУЛЬТАТ: Вне:
Вне:
Точность 81% ! Удивительно, как разморозка последних сверточных слоев может повлиять на производительность модели. Давайте лучше поймем, как наши различные модели показали себя при классификации данных. Сравнение моделей Помимо сравнения моделей, созданных в этой статье, мы также хотим сравнить пользовательскую модель из последней статьи. В начале этой статьи мы загрузили полученные веса модели с нуля, поэтому нам нужно сделать прогнозы для сравнения с моделями трансферного обучения. Поскольку наша последняя модель имела другой целевой размер изображения, сначала нам нужно создать новый ImageDataGenerator для прогнозирования. Вот этот код:
Вне:
Теперь у нас есть прогнозы для всех трех моделей, которые мы хотим сравнить. Ниже приведена функция для визуализации прогнозов по классам в матрице путаницы с использованием Вот наш код визуализации:
РЕЗУЛЬТАТ: Модель трансферного обучения с тонкой настройкой является лучшей, о чем свидетельствует более сильная диагональ и более легкие ячейки повсюду. Из матрицы путаницы мы также можем видеть, что эта модель чаще всего ошибочно классифицирует яблочный пирог как хлебный пудинг. Однако в целом это явный победитель. Улучшения Напомним, что точность нашей пользовательской CNN, модели трансферного обучения с извлечением признаков и точно настроенной модели трансферного обучения составляет 58%, 73% и 81% соответственно. Мы могли бы увидеть улучшение производительности нашего набора данных после введения тонкой настройки. Выбор подходящего количества слоев для размораживания может потребовать тщательного экспериментирования. Другие параметры, которые следует учитывать при обучении сети, включают:
Краткое содержание В этой статье мы решили проблему классификации изображений с использованием пользовательского набора данных с помощью Transfer Learning . Мы увидели, что, используя различные стратегии трансферного обучения, такие как точная настройка, мы можем создать модель, которая превосходит по производительности специально написанную CNN. Некоторые ключевые выводы:
Источник: www.learndatasci.com Комментарии: |
|