Нейронные сети

Приветствую, сегодня я хочу поделиться своим опытом «быстрого старта» в такой области как машинное изучение (machine learning) и постройки своей первой нейронной сети буквально за 1 вечер.

Что такое нейронные сети и зачем это нужно — гугли сам, информации более чем достаточно. Я же хочу рассказать о том, как за 1 вечер смог обучить свою первую нейронную сеть.

В чём трудность (лирика)?

В сети огромное количество информации и мануалов, однако я не смог найти статьи или книги, которые бы объяснили из чего состоит нейронная сеть созданная с помощью Caffe и какой файл за что отвечает. Много мануалов вида «скачайте мои скрипты и запустите их — ура вы сделали свою первую нейронную сеть», естественно, что понимания от таких мануалов не прибавляется.

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

Требования

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

  • Иметь ПК с видеокартой Nvidia, желательно GeForce 950/1050 и выше;

  • Иметь опыт программирования и ознакомиться с языком программирования Python;

  • Иметь возможность установить на компьютер Ubuntu|Kubuntu 17.04 и выше;

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

Подготовка ПК, установка Caffe без компиляции и прочей суеты

Я был удивлён, но Caffe доступна в Ubuntu 17.04 как обычный пакет из репозитория. Я рекомендую сделать чистую установку вышеописанной ОС, в процессе установки обязательно добавить «стороннее программное обеспечение» - не свободно распространяемые компоненты и проприетарные драйвера.

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

sudo apt-get install nvidia-375 nvidia-settings

Здесь 375 — версия драйвера, если вам нужна другая версия, то измените данное число.

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

Установить Caffe и необходимые программы (в том числе и CUDA) можно одной командой:

sudo apt-get install caffe-cuda caffe-doc python3-caffe-cuda python-numpy python-opencv

Всё остальное подтянется автоматически.

Создаём проект

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

deploy.prototxt — файл описывающий слои нашей нейронной сети.

solver.prototxt — файл содержащий параметры обучения нашей нейронной сети

train_val.prototxt — файл описывающий какие слои и чем мы будем тренировать

Вам потребуется отредактировать solver.prototxt и train_val.prototxt для того, чтобы пути к файлам lmbd и mean.binaryproto были актуальны, хотя я и сделал их относительными - по идеи, вам просто нужно запускать команды предварительно перейдя в директориюс проекта с помощь команды "cd".

Теперь давайте разберём, что такое lmbd и mean.binaryproto. Lmbd — это формат, в котором мы должны хранить материалы для обучения, в нашем случае картинки. mean.binaryproto — это бинарный файл, который содержит значения для каждой картинки, если говорить проще, то в данном файле описывается на какой картинке что изображено.

Как создать lmbd файл для обучения? На самом деле подготовить базу для обучения нейронной сети - одно из самых сложных в процессе обучения нейронной сети. Для начала нам нужны картинки, в скаченном вами архиве есть две папки:

  • train — картинки для обучения нейронной сети;

  • test1 — картинки для тестирования нейронной сети.

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

Далее все команды выполняем в терминале, предварительно перейдя в папку проекта (cd [путь до папки проекта], пример: cd /home/SSD/cat_vs_dog/ )

Теперь давайте конвертируем картинки в lmbd базу.

Сначала создаём базу всех картинок (all_list — текстовый файл, содержащий список всех картинок и их категорий, эта база нужна для создания файла mean.binaryproto):

convert_imageset -resize_height 270 -resize_width 270 -shuffle ./input/train/ ./input/all_list ./input/all.lmdb

convert_imageset caffe - своя нейронная сеть

Создаём базу картинок для обучения сети:

convert_imageset -resize_height 270 -resize_width 270 -shuffle ./input/train/ ./input/list ./input/train.lmdb

Теперь создаём базу для проверки в процессе обучения(val_list — содержит список файлов и их категорию для проверки, в процессе обучения):

convert_imageset -resize_height 270 -resize_width 270 -shuffle ./input/train/ ./input/val_list ./input/val.lmdb

Всё, базы для обучения готовы. Генерируем mean.binaryproto:

compute_image_mean ./input/all.lmdb ./input/mean.binaryproto

affe for 1 night 02 s

Подготовительные работы закончены, в папке input у вас должны быть:

  • папка с базой all.lmdb

  • папка с базой train.lmdb

  • папка с базой val.lmdb

  • mean.binaryproto

Запускаем обучение нейронной сети с помощью caffe

Ещё раз идём в текстовые файлы train_val.prototxt и solver.prototxt - проверяем правильность путей до созданных нами файлов.

Осталось запустить обучение. Имейте в виду, что процесс может аварийно завершиться, если у вас недостаточно видеопамяти. Скаченные вами файлы рассчитаны на 3гб видеопамяти, снизить/увеличить нагрузку на память вы можете параметром batch_size, который находится в файле train_val.prototxt.

Стартуем обучение командой:

caffe train -solver solver.prototxt -gpu 0

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

Результатом работы команды будет файл caffe_model_iter_5000.caffemodel, где 5000 — это количество итераций, у вас это число может быть другим. Я подождал 10000 итераций.

Чтобы мониторить состояние GPU используем команду «nvidia-smi -l», запускаем её в отдельном терминале.

affe for 1 night 03 s

Настало время проверить как работает наша нейронная сеть. Но для начала нам нужен файл, который будет расшифровывать ответ сети, в моём примере это «words», в противном случае мы не поймём ответ, так как сеть будет выдавать 1 и 0 в качестве решения задачи. Проверим на картинках из папки test1:

classification deploy.prototxt caffe_model_iter_10000.caffemodel words ./input/test1/55.jpg

Ответом будет список значений с их вероятностью:

0.9929 - "0 cat"
0.0071 - "1 dog"

Пример тестовой картинки для нашей нейронной сети

Результат работы нейронной сети после обработки тестовой картинки

Это значит, что на картинке с вероятностью 99,29% кошка. Что полностью соответствует действительности. Скачайте любое изображение кошки/собаки с google и проверьте работу своей сети.

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

Вот и всё, поздравляю — вы создали свою нейронную сеть.

 

Об авторе блога


Дмитрий Кушавин

Персональный блог. IT, безопасность, политика и важные новости.