Как обучить и применить свою первую глубокую нейронную сеть

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

Автор: Пит Уорден (Pete Warden)

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

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

Устанавливаем виртуальную машину

Для работы с виртуальной машиной нам понадобится компьютер с OS X или Linux и свободное ПО для виртуализации Vagrant. Если у вас еще нет Vagrant, перейдите по ссылке и следуйте инструкциям в разделе «Getting Started» («Приступая к работе»).

После установки Vagrant открываем новое окно терминала и создаем каталог для виртуальной машины с помощью следующих команд:

mkdir ~/dl_webcast
cd ~/dl_webcast

Теперь загружаем образ виртуальной машины. Размер образа составляет почти 2 ГБ, поэтому процесс загрузки может занять некоторое время.

vagrant box add dl_webcast https://d2rlgkokhpr1uq.cloudfront.net/dl_webcast.box

Загрузив образ, запускаем новый виртуальный сервер:

vagrant init dl_webcast
vagrant up

Входим в виртуальную машину:

vagrant ssh

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

Я покажу вам, как работать с фреймворком для глубокого обучения Caffe, разработанным Янцином Цзя (Yangqing Jia) и командой Berkeley Vision and Learning Center (BVLC). Данный фреймворк имеет активное сообщество разработчиков, полностью открытый исходный код (в то же время предварительно обученные модели нельзя использовать в коммерческих целях), а также массу документации, так что он может послужить хорошей отправной точкой. Чтобы начать работу, переходим в каталог фреймворка:

cd ~/caffe

Мы будем использовать нейронную сеть, основанную на архитектуре Крижевского (Krizhevsky) и его команды, позволившей им выиграть соревнование ImageNet 2012. Сеть уже обучена командой BVLC, но поскольку обучение происходило на наборе изображений, доступном только для некоммерческого использования, она также может применяться только в исследовательских целях. Данная сеть способна распознавать 1 000 различных категорий объектов. Классификация выполняется с помощью простой команды:

python python/classify.py --print_results examples/images/cat.jpg foo

Мы увидим ряд информационных сообщений, последнее из которых будет иметь следующий вид:

[('kit fox', '0.27215'), ('red fox', '0.19984'), ('wood rabbit', '0.13209'), ('hare', '0.07283'), ('Egyptian cat', '0.06632')]

Поздравляю! Только что вы впервые классифицировали изображение с помощью глубокой нейронной сети. Выходной массив содержит предположения о том, какой объект представлен на изображении. Числа характеризуют «уверенность» алгоритма, а текстовые метки описывают категории. Взглянув на тестовое изображение, мы увидим, что это не совсем лисица (kit fox), но причина ошибки вполне понятна.

https://github.com/BVLC/caffe/blob/master/examples/images/cat.jpg

https://github.com/BVLC/caffe/blob/master/examples/images/cat.jpg

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

~/dl_webcast/

В файловой системе виртуальной машины они появятся в следующем каталоге:

/vagrant/

Самостоятельно обучаем нейронную сеть

Нейронная сеть, обученная на изображениях ImageNet, с которой мы только что поработали, способна распознавать тысячу категорий объектов, поэтому для ее обучения необходим набор данных, состоящий более чем из миллиона различных изображений. При этом процесс обучения занимает более недели даже при использовании высокопроизводительного графического процессора (GPU). К счастью, существуют более простые задачи распознавания изображений. В рамках подобных задач обучение нейронной сети требует значительно меньше времени. Я расскажу вам, как обучить сеть для решения одной из них.

Одной из первых задач, для решения которых были применены сверточные нейронные сети (convolutional neural network), была задача распознавания рукописных цифр. Ян Лекун (Yann LeCun) сделал большой вклад в данную область знаний в 90-е годы, а версия его архитектуры LeNet включена в состав Caffe. Загрузим набор данных MNIST, состоящий из 70 000 изображений рукописных цифр:

cd data/mnist
./get_mnist.sh
cd ../..
cd examples/mnist

После загрузки изображений, нужно изменить один параметр процесса обучения. Я уже сделал это в виртуальной машине, которую вы загрузили, но если вы начинаете весь процесс с нуля, тогда необходимо открыть файл lenet_solver.prototxt в редакторе nano (или в любом другом) и изменить последнюю строку, задав CPU вместо GPU, потому что в виртуальной машине мы не можем использовать преимущества видеокарты. Запустим процесс обучения с помощью следующего скрипта:

./train_lenet.sh

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

ls -l

Мы должны увидеть созданный файл со следующим именем:

lenet_iter_10000

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

python python/classify.py --print_results --model_def examples/mnist/lenet.prototxt --pretrained_model examples/mnist/lenet_iter_10000 --force_grayscale --center_only --labels_file data/mnist/mnist_words.txt --images_dim 28,28 data/mnist/sample_digit.png foo

В результате получим сообщение о том, что с вероятностью 100% это цифра 4, что соответствует действительности!

Руководство по установке

Ниже представлены команды, которые я выполнил, чтобы создать виртуальную машину, описанную выше. Если вы используете Vagrant, создайте чистый образ Ubuntu 14.04:

vagrant box add ubuntu-14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

После создания и инициализации виртуальной машины, входим в нее и запускаем процесс установки CUDA. Чтобы собрать Caffe, необходимы заголовочные файлы и библиотеки CUDA, даже если мы собираемся работать только на CPU. Поэтому нам не обойтись без пакета CUDA, размер которого составляет 900 МБ.

sudo apt-get install linux-headers-uname -r
curl -O "http://developer.download.nvidia.com/compute/cuda/6_0/rel/installers/cuda_6.0.37_linux_64.run"
chmod +x cuda_6.0.37_linux_64.run
sudo ./cuda_6.0.37_linux_64.run --kernel-source-path=/usr/src/linux-headers-3.13.0-30-generic/

В процессе установки мы должны задать различные параметры. Необходимо отказаться от установки драйвера (поскольку в виртуальной машине мы не можем использовать GPU), но при этом установить примеры и SDK, оставив пути по умолчанию. После этого нужно добавить в переменную среды LD_LIBRARY_PATH путь к SDK.

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64' >> ~/.bashrc
source ~/.bashrc

Теперь установим ряд зависимостей с помощью apt-get:

sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler gcc-4.6 g++-4.6 gcc-4.6-multilib g++-4.6-multilib gfortran libjpeg62 libfreeimage-dev libatlas-base-dev git python-dev python-pip

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

wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make
sudo make install
cd ..

Загружаем исходный код Caffe:

git clone https://github.com/BVLC/caffe.git
cd caffe

CUDA имеет проблемы с компилятором по умолчанию gcc 4.8, поэтому нужно заменить его на gcc 4.6:

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-4.6 30
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-4.6 30

Для работы Caffe также требуется целый ряд модулей Python, которые можно установить согласно списку с помощью pip. Этот процесс может занять некоторое время:

sudo pip install -r python/requirements.txt

В текущей версии Caffe не предусмотрена возможность смены компилятора, поэтому необходимо внести некоторые изменения в make-файлы:

cp Makefile.config.example Makefile.config
echo "CXX := /usr/bin/g++-4.6" >> Makefile.config
sed -i 's/CXX :=/CXX ?=/' Makefile

Компилируем Caffe:

make all
make test

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

examples/imagenet/get_caffe_reference_imagenet_model.sh
mv caffe_reference_imagenet_model examples/imagenet
data/ilsvrc12/get_ilsvrc_aux.sh

По материалам: O’Reilly

1 комментарий

  1. Юра:

    При попытке скачивания образа виртуальной машины получаю ошибку:
    An error occurred while downloading the remote file. The error
    message, if any, is reproduced below. Please fix this error and try
    again.

    The requested URL returned error: 403 Forbidden

    Через браузер ссылка тоже не работает.
    Погуглив интернет нашел гайд по устнаовке пакета через atlas.hashicorp.com но к сожалению это тоже не работает (возможно потому что у меня Mac)
    Получаю ошибку: The «VBoxManage» command or one of its dependencies could not
    be found. Please verify VirtualBox is properly installed. You can verify
    everything is okay by running «VBoxManage —version» and verifying
    that the VirtualBox version is outputted.

    If you’re on Windows and just installed VirtualBox, you have to
    log out and log back in for the new environmental variables to take
    effect. If you’re on Linux or Mac, verify your PATH contains the folder
    that has VBoxManage in it.

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

Добавить комментарий

Ваш e-mail не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =