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

Я буду арендовать графические процессоры Paperspace (графические процессоры) для обучения нейронных сетей, поскольку их стоимость кажется вполне доступной. В частности, мы будем использовать графические процессоры Nvidia, поскольку они поддерживают CUDA.

fast.ai требует Python 3

Краткий обзор Fast AI

Fast ai построен на основе pytorch, библиотеки глубокого обучения, созданной Facebook. Библиотека использует лучшие практики и подходы в отрасли и исследованиях. Каждый раз, когда публикуется интересная статья, они тестируют ее на различных наборах данных, настраивают и внедряют в библиотеке.

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

Быстрый ИИ управляется кодом и использует подход сверху вниз или подход всей игры Дэвида Перкинса. Таким образом, студенты сразу начинают пользоваться нейронными сетями и получают результаты как можно скорее.

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

Давайте перейдем к соревнованию "Кошки против собак".

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

Мы собираемся использовать сверточные нейронные сети для классификации изображений.

Импорт

Путь к данным

Эта структура папок является стандартным способом обмена файлами классификации изображений. Каждая папка сообщает вам этикетку, например. кошки и собаки.

Глядя на изображение кошки

f’{PATH}valid/cats/{files[4]}’ - Это Python 3.6. строка формата, удобная для форматирования строки.

построение изображения

давайте посмотрим, как выглядят данные…

Изображение представляет собой 3-х ранговый тензор или 3-х мерный массив. (374, 500, 3)

(66,38,24) - значения красного, синего и зеленого пикселей в диапазоне от 0 до 255. Цифры представляют собой часть того, что изображение выглядит внутри компьютера. Мы возьмем эти числа и будем использовать их, чтобы предсказать, является ли изображение кошкой или собакой, просмотрев множество изображений.

Перейдем к обучению модели.

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

Вместо того, чтобы строить модель с нуля, нужно решить аналогичную задачу. Мы будем использовать модель, обученную в ImageNet (1,2 миллиона изображений и 1000 классов). Модель представляет собой сверточную нейронную сеть (CNN).

Что такое предварительно обученная модель?

Предварительно обученная модель - это модель, которая была ранее обучена на наборе данных и содержит веса и смещения, которые представляют особенности того набора данных, на котором она была обучена.

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

Зачем использовать предварительно обученную модель?

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

Мы будем использовать модель resnet34.

Resnet34 - это версия модели, победившей в конкурсе ImageNet 2015 года. Другие архитектуры компьютерного зрения включают; AlexNet, VGG Net, GoogleNet, ResNeXt и т. Д.

arch определяет архитектуру, которую мы будем использовать (resnet34)

data объект содержит данные обучения и проверки.

ImageClassifierData.from_paths считывает изображения и их метки, указанные как имена подпапок:

  • path: корневой путь к данным (используется для хранения обученных моделей, предварительно вычисленных значений и т. Д.)
  • bs: размер партии. По умолчанию 64.
  • tfms: преобразования (для увеличения данных). например вывод tfms_from_model. По умолчанию "Нет"
  • trn_name: имя папки, содержащей обучающие изображения. По умолчанию "поезд"
  • val_name: имя папки, содержащей проверочные изображения. По умолчанию "действительный"
  • test_name: имя папки, содержащей тестовые изображения. По умолчанию "Нет"
  • num_workers: количество рабочих. По умолчанию '8'

tfms= tfms_from_modeltransformations - это готовит данные для передачи в нашу модель. Например, нормализация и изменение размера.

learn содержит модель

ConvLearner.pretrained:

  • f: арка. Например, resnet34
  • data: ранее определенный объект данных
  • precompute: включить / исключить предварительно вычисленные активации. По умолчанию 'False' (предварительные вычисления - с использованием предварительно обученных весов)

learn.fit обучает / подгоняет модель в соответствии с заданной скоростью обучения и эпохами. В этом случае он будет делать 3 epochs с 0.01 learning rate, что означает, что он будет просматривать каждое изображение в общей сложности три раза.

trn_loss и val_loss - значения функции потерь кросс-энтропии.

Насколько хороша эта модель? наша модель получила точность 99%. Уровень техники составлял 80%, но в результате соревнований был достигнут огромный прыжок с точностью 98,9%. Менее чем через 4 года этот результат можно будет превзойти за секунды.

Так что по состоянию на 2013 год вы могли получить классификатор изображений-победителей Kaggle в конце за 17 секунд и 3 строки кода. Но сначала он загружает предварительно обученную модель из Интернета; это занимает 2 мин. Затем он предварительно вычисляет некоторые кеши; это займет 1 полторы минуты при первом запуске модели. Последующее обучение занимает 20 секунд.

Следовательно, неверно утверждать, что глубокое обучение требует много времени, ресурсов и данных.

Анализ результатов

Если посмотреть на набор проверки, это набор 0's и 1’s, где 0’s представляют кошек, а 1’s - собак.

Давайте посмотрим на первые десять прогнозов

Первая колонна - кошки, вторая - собаки. Модель возвращает журнал прогноза вместо вероятностей. Чтобы получить вероятности, возьмите exp из log.

Печать нескольких случайных правильных изображений

Собака - 1, поэтому все, что больше 0,5, - собака, а все, что меньше - кошка.

Печать неправильных изображений

Самые правильные кошки

Самые правильные собаки

Самые неправильные кошки (классифицируются как собаки, но они кошки)

Самые неправильные собаки (собаки, которых машина на самом деле приняла за кошек)

Самый неопределенный прогноз, близкий к 0,5. Классификатор действительно не знает, что делать с этими изображениями.

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

Назначение: захватить данные двух или более разных вещей, поместить их в разные папки и передать их по древовидной структуре кода (модели). Лучшими фотографиями будут обычные дневные фотографии, которые люди фотографируют сегодня. Примечание. спутниковые снимки , компьютерная томография, изображение под микроскопом и патология не работают для этого кода. (10 примеров подойдут)

Примеры классификации изображений

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

Давайте вернемся немного назад, что такое Deep Learning?

Глубокое обучение - это разновидность машинного обучения. Однако это не равно машинному обучению. В машинном обучении мы должны делать большую часть разработки функций самостоятельно, в глубоком обучении мы оставляем это на усмотрение нейронной сети.

C-Path (Computational Pathologist) - пример традиционного подхода к машинному обучению. Для исследования были взяты патологические слайды биоптатов рака груди. Затем многие патологи советовались с идеями о том, какие закономерности или особенности могут быть связаны с долгосрочным выживанием. Затем они написали специальные алгоритмы для расчета этих характеристик, выполнения логистической регрессии и прогнозирования выживаемости. Алгоритмы превзошли патологов. Однако на создание этой системы у экспертов в предметной области и компьютерных экспертов ушло много лет.

Ниже приведены свойства, которые улучшают класс алгоритмов глубокого обучения:

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

Базовая функция, которую использует глубокое обучение, называется нейронной сетью.

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

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

Давайте выясним лучший набор параметров, которые будут следовать за функцией потерь вниз, чтобы найти минимум, таким образом, заканчиваясь на локальном минимуме.

Поиск параметров должен производиться в разумные сроки, следовательно, с использованием графических процессоров.

На диаграмме ниже графические процессоры в 10 раз быстрее процессоров.

Чтобы сделать нейронную сеть масштабируемой и быстрой, нам нужно несколько скрытых слоев, отсюда и слово «глубокое обучение».

ссылка на другой пример;

Диагностика рака легких

Вещи, для которых вы могли бы использовать глубокое обучение;

Ключевой частью сверточной нейронной сети является свертка, этот веб-сайт имеет визуальное объяснение свертки. Также ознакомьтесь с этой интерактивной книгой о нейронных сетях.

Как установить параметры

Давайте возьмем квадратичную функцию и попробуем найти минимум.

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

Сделайте небольшой шаг влево, чтобы создать новую точку Xn+1, и продолжайте повторять процесс, делая небольшие шаги каждый раз, когда это приближает вас к минимуму.

Маленький шаг и цифра, обозначенные ℓ, называются скоростью обучения.

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

Сочетание линейности, нелинейности, свертки и градиента дает нам сверточную нейронную сеть.

Выбор скорости обучения

learn.fit(0.01, 3)

0.01 - скорость обучения. Это то, что вам нужно установить.

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

Метод learn.lr_find() помогает найти оптимальную скорость обучения. Он использует технику, разработанную в статье 2015 года Циклические скорости обучения для обучения нейронных сетей, где мы просто продолжаем увеличивать скорость обучения с очень небольшого значения, пока потери не перестанут уменьшаться. Мы можем построить график скорости обучения по пакетам, чтобы увидеть, как это выглядит.

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

Наш объект learn содержит атрибут sched, который содержит наш планировщик скорости обучения и имеет некоторые удобные функции построения графиков, включая этот:

Обратите внимание, что на предыдущем графике итерация - это одна итерация или мини-пакет SGD (стохастический градиентный спуск). В одну эпоху существует (num_train_samples/num_iterations) SGD.

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

Мы можем увидеть график зависимости потерь от скорости обучения, чтобы увидеть, где наши потери перестают уменьшаться:

Вернитесь назад и посмотрите, в какой момент мы увидели лучшее улучшение, а затем используйте эту скорость обучения. Потери по-прежнему явно уменьшаются до lr=1e-2 (0.01), так что мы используем именно это.

Обратите внимание, что оптимальная скорость обучения может меняться по мере обучения модели, поэтому вы можете время от времени запускать эту функцию повторно.

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

Обучение модели не доходит до 100%, поскольку она замечает, что потери ухудшаются, и останавливается. Дойдет до 75%

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

Выбор количества эпох

learn.fit(0.01, 3)

3 это количество эпох.

Эпоха - это одно полное представление набора данных, который необходимо изучить модели.

Для каждой эпохи мы печатаем потери обучения, валидацию и точность.

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

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

Советы и хитрости по jupyter notebook

1.Проверьте название функции, которое вы не можете запомнить, введите первую букву и нажмите tab один раз.

2. Если вы не можете вспомнить аргументы метода, нажмите shit+tab.

3. Если вы не можете вспомнить, что делает функция, нажмите shift+ tab + tab. Это вызовет документацию.

4. Набрать ?? перед тем, как функция вызовет исходный код.

5. нажатиеH вывести сочетание клавиш. Попробуйте изучать 4–5 из них в день и практикуйтесь.

После завершения работы всегда останавливайте свое рабочее пространство, гребень или AWS. в противном случае с вас будет взиматься плата.

Не торопитесь и общайтесь на форумах.

Спасибо за чтение, я ценю! подписывайтесь на @itsmuriuki.

Вернемся к обучению!