Как начать работу со сверточной нейронной сетью

Нейронные сети
Как начать работу со сверточной нейронной сетью
Сверточная нейронная сеть может рассматриваться как очень популярная сеть в глубокой нейронной сети. Эта статья начинается с основ, знакомит с основными принципами сверточных сетей и других связанных технологий и использует сверточные сети для создания простого проекта в качестве примера. Друзья, которые хотят запустить CNN, не должны пропустить это~

из среды,Автор: Тирмидзи Файзал Афлахи, участие: Хань Фан, Ван Шутин.

Во-первых, давайте взглянем на фото ниже:

Источник: Pix2PixHD

Это не настоящее фото, вы можете создать новое окно, чтобы открыть его, увеличить масштаб и увидеть мозаику.

На самом деле это фото создано искусственным интеллектом, оно выглядит настоящим?

Прошло всего семь лет с тех пор, как Алекс Крижевский и его друзья объявили об этой технологии через ImageNet. ImageNet — это крупномасштабное соревнование по распознаванию изображений, которое проводится каждый год и в котором распознается более 1000 видов, от аляскинских маламутов до приложений для туалетной бумаги. После этого они создали AlexNet, которая выиграла конкурс ImageNet, далеко опередив второе место.

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

Источник: ImageNet

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

Внедрение глубокого обучения больше связано с нарушением правил, чем с их изменением.

Архитектура сверточной нейронной сети

Итак, вопрос в том, как работает сверточная нейронная сеть?

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

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

Диаграмма глубокой сверточной нейронной сети от Mynepalli

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

Это вводит еще одну технику - трансферное обучение.

передача обучения

Трансферное обучение использует обученную модель глубокого обучения для изучения конкретной задачи.

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

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

Трансферное обучение имеет два основных преимущества:

  • По сравнению с обучением с нуля вы можете получить хорошие результаты, используя всего несколько изображений. Конкурс ImageNet предоставил один миллион изображений для обучения. При трансферном обучении вам нужно всего 1000 или даже 100 изображений для обучения хорошей модели, поскольку ваша предварительно обученная модель уже обучена на миллионе изображений.

  • Хороших результатов можно добиться с меньшими затратами времени на тренировки. Чтобы получить такую ​​же производительность, как у модели ImageNet, вам может потребоваться обучение в течение нескольких дней, не считая времени, необходимого для настройки модели, когда она не работает должным образом. Однако при трансферном обучении вам может понадобиться всего несколько часов или даже минут, чтобы подготовиться к конкретной задаче, что значительно сэкономит время.

Классификация изображений для генерации изображений

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

За отсос Стинга!

Именно здесь возникают генеративно-состязательные сети.

CycleGAN, предложенный Zhu Junyan et al.

При некотором вводе этот метод может генерировать соответствующие изображения.

Как показано на рисунке выше, CycleGAN может генерировать соответствующую реальную фотографию из картины, фотографию рюкзака из эскиза и даже реконструкцию со сверхвысоким разрешением.

Генеративно-состязательные сети для суперразрешения

Это удивительно, правда?

Конечно, вы можете научиться строить эти сети. Но как начать?

Учебник по сверточной нейронной сети

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

Давайте начнем с основ.

Источник: Томас Вербрюгген на Unsplash.

Идентификация кактусов с аэрофотосъемки

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

Это выглядит очень просто?

Kaggle предоставляет 17 500 изображений, 4000 из которых не помечены как тестовый набор. Если ваша модель может правильно пометить 4000 изображений, она получит полную оценку 1 или 100%.

Я долго искал и, наконец, нашел следующий проект, который очень подходит для начинающих.

Кактус

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

Итак, что вам нужно?

Создание сверточных нейронных сетей с помощью Python

Да, Python — самый популярный язык в глубоком обучении. Что касается фреймворков глубокого обучения, у вас есть много вариантов, которые вы можете попробовать сами:

  1. Tensorflow, самый популярный фреймворк для глубокого обучения, создан инженерами Google и имеет наибольшее количество участников и поклонников. Благодаря большому сообществу легко найти решение проблемы. Их высокоуровневый API, keras, популярен среди новичков.

  2. Pytorch, мой любимый фреймворк для глубокого обучения. Чистая реализация Python, унаследовавшая, таким образом, различные преимущества и недостатки Python. Разработчикам Python будет легко начать работу. Он также предоставляет абстракции из библиотеки FastAI, как это делает Keras для Tensorflow.

  3. MXNet — фреймворк глубокого обучения, разработанный Apache.

  4. Theano, предшественник Tensorflow.

  5. CNTK — фреймворк глубокого обучения, разработанный Microsoft.

В этом руководстве используется мой любимый Pytorch и FastAI.

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

Теперь откройте командную строку или терминал и установите следующие библиотеки:

pip install numpy pip install pandas pip install jupyter

Numpy используется для хранения входных изображений, pandas — для обработки CSV-файлов, а блокнот Jupyter — для кодирования.

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

После этого установите torchvision и FastAI:

pip install torchvision pip install fastai

Запустите команду блокнота Jupyter, чтобы открыть Jupyter, и откроется окно браузера.

Нужная среда настроена, приступим.

Подготовить данные

Импортируйте необходимый код:

import numpy as npimport pandas as pd from pathlib import Path from fastai import * from fastai.vision import * import torch %matplotlib inline

Numpy и Pandas в основном нужны для любой задачи. FastAI и Torch — ваши библиотеки глубокого обучения. Matplotlib Inline используется для отображения графиков.

Теперь вы можете скачать данные с официального сайта соревнований Kaggle.

Разархивируйте zip-файл и поместите его в папку блокнота Jupyter.

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

Папка Train содержит все тренировочные изображения.

Папка Test предназначена для отправки тестовых изображений.

Документ Train CSV содержит информацию об обучающих данных, которая сопоставляет имя изображения со столбцом has_cactus, если в столбце есть кактус, значение равно 1, в противном случае — 0.

В Образце представления CSV является обязательным форматом для представления. Имена файлов соответствуют картинкам в папке Test.

train_df = pd.read_csv("train.csv")

Загрузите документ Train CSV в фрейм данных.

data_folder = Path(".") train_images = ImageList.from_df(train_df, path=data_folder, folder='train')

Используйте метод ImageList from_df для создания генератора нагрузки для сопоставления фрейма данных train_df с изображениями в папке train.

увеличение данных

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

Если у вас небольшой объем данных, вы можете попробовать этот метод.

transformations = get_transforms(do_flip=True, flip_vert=True, max_rotate=10.0, max_zoom=1.1, max_lighting=0.2, max_warp=0.2, p_affine=0.75, p_lighting=0.75)

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

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

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

train_img = train_img.transform(transformations, size=128)

Размер параметра будет использоваться для масштабирования входных данных вверх или вниз в соответствии с нейронной сетью, которую вы будете использовать. Сеть, которую я использую, называется DenseNet — результат конкурса ImageNet 2017 Best Paper Award, размер входного изображения которого составляет 128*128.

готов тренироваться

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

test_df = pd.read_csv("sample_submission.csv") test_img = ImageList.from_df(test_df, path=data_folder, folder='test')train_img = train_img           .split_by_rand_pct(0.01)           .label_from_df()           .add_test(test_img)           .databunch(path='.', bs=64, device=torch.device('cuda:0'))                       .normalize(imagenet_stats)

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

FastAI предоставляет функцию split_by_rand_pct, которая может легко выполнять вышеуказанные операции.

Функция databunch может быть пакетной. Размер моего пакета составляет 64 из-за ограничений памяти графического процессора. Если у вас нет графического процессора, игнорируйте параметр устройства.

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

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

learn = cnn_learner(train_img, models.densenet161, metrics=[error_rate, accuracy])

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

однотактная технология

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

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

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

Но это легче сказать, чем сделать.

Итак, парень по имени Лесли Смит придумал стратегию с одним циклом.

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

learn.lr_find() learn.recorder.plot()

Вы получите вывод следующим образом:

Минимум ошибки составляет 10 ^ -1, поэтому мы можем использовать скорость обучения, немного меньшую, чем это значение, например 3 * 10 ^ -2.

lr = 3e-02 learn.fit_one_cycle(5, slice(lr))

Потренируйтесь на несколько эпох (здесь я выбираю 5, не слишком большую и не слишком маленькую) и посмотрите на результаты.

Подожди, что происходит? !

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

Я не могу дождаться, чтобы представить! Ха-ха. Теперь давайте спрогнозируем и отправим результаты набора тестов.

preds,_ = learn.get_preds(ds_type=DatasetType.Test) test_df.has_cactus = preds.numpy()[:, 0]

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

test_df.to_csv('submission.csv', index=False)

Приведенная выше строка кода создаст CSV-файл, содержащий имена 4000 тестовых изображений и информацию о том, содержит ли каждое изображение ярлык для кактуса.

Когда я попытался отправить, я обнаружил, что мне нужно отправить CSV через ядро ​​Kaggle, чего я раньше не замечал.

Источник: Kaggle

К счастью, операции ядра очень похожи на блокноты Jupyter. Вы можете скопировать и вставить созданное в блокнот и отправить его.

Тогда, Дуанг~ готово!

МОЙ БОГ! Результат оказался 0,9999, что довольно неплохо. Конечно, если вы набрали такой хороший результат с первой попытки, есть куда расти.

Итак, я настроил структуру сети и попробовал еще раз.

Оценка 1! Я это сделал! ! Так что вы тоже можете, это на самом деле не так сложно.

(Кроме того, этот рейтинг от 13 апреля, и мой рейтинг, вероятно, упал к настоящему времени...)

Что я выучил

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

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

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

Источник: Марио Мрад на Unsplash

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

Итак, выберите хороший проект сверточной нейронной сети, подготовьте высококачественные данные и вперед!