TensorFlow для поэтов

Автор оригинальной публикации: Пит Уорден (Pete Warden)

Перевод Станислава Петренко

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

Мне всегда очень нравилось руководство «EC2 for Poets»EC2 для поэтов»), при этом я никогда не встречал подобного руководства по глубокому обучению, которое было бы адресовано столь же широкой аудитории. «EC2 for Poets» представляет собой последовательное объяснение концепции облачных вычислений, доступное каждому, кто обладает базовыми навыками работы с компьютером. В этом руководстве без ненужной таинственности описан пошаговый процесс создания простого приложения на облачной платформе. В таком же стиле, я хочу показать всем, кто имеет ноутбук Mac и умеет работать с терминалом, как создать собственный классификатор изображений с помощью TensorFlow, без необходимости писать код.

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

Docker

TensorFlow можно установить непосредственно на OS X, но при этом необходимо учитывать различные особенности установки других инструментов, таких как Python. Как следствие, в подобном случае трудно создать универсальное руководство. Чтобы облегчить задачу, мы будем использовать свободную контейнерную систему Docker, которая позволит нам установить виртуальную машину Linux на наш MacBook Pro. Благодаря такому подходу, я смогу ориентироваться на конкретный образ системы, следовательно, мое руководство будет максимально универсальным и подходящим для всех.

Устанавливаем Docker

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

  • Открываем в браузере страницу docs.docker.com/mac/.

  • Первый шаг инструкции направляет нас на страницу загрузки Docker Toolbox.

  • На странице загрузки нажимаем кнопку, соответствующую Mac.

  • В результате загрузится файл DockerToolbox-1.10.2.pkg.

  • Запускаем этот файл, чтобы начать установку.

  • В конце процесса установки выбираем Docker Quickstart Terminal.

  • Откроется окно терминала и запустится скрипт настройки.

  • После завершения настройки мы увидим изображение кита, созданное с помощью ASCII-графики, и приглашение к вводу команд.

  • Вернемся к первому шагу инструкции и, следуя рекомендации, выполним в терминале тестовую команду:
    docker run hello-world
  • На экране появится сообщение, свидетельствующее о том, что Docker работает правильно:
    Hello from Docker.
    This message shows that your installation appears to be working correctly.

Устанавливаем TensorFlow

Теперь у нас есть Docker, а значит, мы можем загрузить и использовать виртуальную машину Linux с предустановленной библиотекой TensorFlow. Поскольку я хочу продемонстрировать вам пример, который появился после выхода последней версии TensorFlow 0.7.1, предустановленной в виртуальной машине, нам придется обновить исходный код с помощью git. Когда будет выпущена версия 0.8.0, можно будет просто заменить в представленной ниже команде «0.7.1» на «0.8.0» и пропустить раздел «Обновляем исходный код» данного руководства. Дополнительная информация содержится в разделе «Docker» документации TensorFlow.

Чтобы загрузить и запустить Docker-образ с предустановленной TensorFlow, выполним в терминале следующую команду:

docker run -it b.gcr.io/tensorflow/tensorflow:0.7.1-devel

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

Когда образ будет собран и запущен, в терминале появится новое приглашение командной строки. Это и есть терминал виртуальной машины Linux, которую мы только что загрузили. Для проверки выполним следующую команду:

ls /tensorflow

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

Оптимизируем Docker

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

Docker запускает образы с помощью VirtualBox, поэтому для настройки мы воспользуемся панелью управления VirtualBox. Выполним следующие действия:

  • На нашем Mac находим и запускаем приложение VirtualBox. Для этого можно воспользоваться поисковым инструментом Spotlight, благодаря которому нам не придется рыться в файловой системе.

  • В левой панели открывшегося окна VirtualBox мы видим список виртуальных машин. Нас интересует работающая в данный момент машина с названием «default» («по умолчанию»).

  • Вызываем контекстное меню, щелкнув правой клавишей мыши на этой машине, и выбираем пункт «Закрыть -> Завершить работу» («Close -> ACPI Shutdown»). Другие варианты выключения также должны работать, но выбранный нами вариант – самый корректный.

  • Когда виртуальная машина завершит работу, под ней появится надпись «Выключена» («Powered off»). Еще раз щелкнем на ней правой клавишей мыши и выберем в меню пункт «Настроить…» («Settings…»).

  • В открывшемся диалоге настроек переходим в раздел «Система» («System») и открываем вкладку «Материнская плата» («Motherboard»).

  • Перетаскиваем ползунок «Основная память» («Base Memory») вправо до конца зеленого интервала, что обычно соответствует 75% от общего объема памяти компьютера. В моем случае это значение составляет 12 ГБ, поскольку на моем ноутбуке установлено 16 ГБ памяти.

  • Открываем вкладку «Процессор» («Processor») и увеличиваем количество процессоров, которое по умолчанию обычно равно 1. Для современного MacBook Pro подходящим значением, вероятно, будет 4. В общем случае, ориентиром для нас является зеленый интервал.

  • Нажимаем кнопку «OK» в диалоге настроек.

  • Запускаем машину «default», щелкнув на ней правой клавишей мыши и выбрав пункт меню «Запустить -> Запустить в фоновом режиме» («Start -> Headless Start»).

Когда мы остановили виртуальную машину, прекратил работу и терминал Linux. Соответственно, сейчас в нашем терминале мы видим приглашение OS X. Теперь, когда мы снова запустили виртуальную машину, чтобы получить к ней доступ, необходимо повторить команду:

docker runit b.gcr.io/tensorflow/tensorflow:0.7.1-devel

Единственное отличие состоит в том, что теперь виртуальная машина имеет доступ к значительно большим вычислительным ресурсам нашего ноутбука, следовательно, пример будет выполняться намного быстрее!

Загружаем изображения

Оставшаяся часть моего руководства основана на примере повторного обучения (retrain) с сайта TensorFlow. Этот пример показывает, как с помощью собственных изображений, размещенных в каталогах по категориям, можно быстро повторно обучить верхний слой уже обученной нейронной сети Inception для распознавания новых категорий. Вначале необходимо загрузить обучающие изображения. Мы будем загружать их в файловую систему OS X, поэтому, если в терминале мы видим приглашение Linux «root@…», нужно выполнить команду «exit» для выхода.

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

cd $HOME

mkdir tf_files

cd tf_files

curl -O http://download.tensorflow.org/example_images/flower_photos.tgz

tar xzf flower_photos.tgz

open flower_photos

В результате откроется окно файлового менеджера Finder, в котором мы увидим пять каталогов:

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

Разрешаем виртуальной машине доступ к каталогу в OS X

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

docker run -it -v $HOME/tf_files:/tf_files b.gcr.io/tensorflow/tensorflow:0.7.1-devel

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

ls /tf_files/flower_photos

Мы должны увидеть список каталогов:

root@2c570d651d08:~# ls /tf_files/flower_photos

LICENSE.txt daisy dandelion roses sunflowers tulips

root@2c570d651d08:~#

Обновляем исходный код

Нам необходима самая последняя версия исходного кода, поскольку рассматриваемый нами пример был добавлен совсем недавно. Чтобы обновить код, нам придется немного потрудиться. Мы будем использовать систему управления версиями git. Я подробно опишу весь процесс.

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

git config —global user.email «you@example.com»

git config —global user.name «Your Name»

Теперь мы можем загрузить последнюю версию исходного кода.

cd /tensorflow/

git pull origin master

В результате откроется текстовый редактор Vim. Просто выполним команду «:quit», чтобы выйти из него.

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

git checkout 6d46c0b370836698a3195a6d73398f15fa44bcb2

Компилируем исходный код

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

cd /tensorflow/

bazel build -c opt —copt=-mavx tensorflow/examples/image_retraining:retrain

В зависимости от скорости машины, процесс займет от 5 до 10 минут, поскольку выполняется компиляция всего исходного кода TensorFlow. Не беспокойтесь, если увидите множество предупреждений, – это нормально.

Обучаем модель

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

bazel-bin/tensorflow/examples/image_retraining/retrain \

—bottleneck_dir=/tf_files/bottlenecks \

—model_dir=/tf_files/inception \

—output_graph=/tf_files/retrained_graph.pb \

—output_labels=/tf_files/retrained_labels.txt \

—image_dir /tf_files/flower_photos

На экране появится сообщение о загрузке модели Inception, а затем множество сообщений о вычислении bottleneck-значений. Всего необходимо обработать около 3 700 изображений. Моя машина позволяет обрабатывать около 200 изображений в минуту, соответственно, весь процесс занимает около 20 минут. Более подробную информацию можно найти в документации TensorFlow.

Я заменил каталог по умолчанию /tmp на каталог с общим доступом /tf_files для таких объектов, как выходной граф и bottleneck-файлы. Благодаря этому, результаты будут доступны из OS X и сохранятся между различными запусками виртуальной машины.

После того, как bottleneck-значения будут вычислены, начнется процесс обучения последнего слоя нейронной сети. Это займет еще около 5 минут. В конце будет выведена строка, сообщающая итоговую ожидаемую точность, составляющую около 90%. Это означает, что мы обучили классификатор, который 9 раз из 10 правильно определяет название цветка по его изображению!

Применяем классификатор

После завершения процесса обучения мы получили выходной граф output_graph.pb. Теперь мы можем протестировать его с помощью небольшого демонстрационного приложения label_image, написанного на C++, которое загружает граф и применяет его для классификации произвольного изображения. Сделаем это следующим образом:

bazel build tensorflow/examples/label_image:label_image && \

bazel-bin/tensorflow/examples/label_image/label_image \

—graph=/tf_files/retrained_graph.pb \

—labels=/tf_files/retrained_labels.txt \

—output_layer=final_result \

—image=/tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg

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

Следующие шаги

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

Наконец, вам захочется использовать классификатор в своем собственном приложении! Рассмотренный нами демонстрационный пример label_image является хорошим шаблоном приложения, если ваш продукт позволяет интегрировать код C++. Кроме того, TensorFlow может работать на мобильных устройствах, поэтому ознакомьтесь с демо для Android, если вас интересует приложение для смартфона.

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

Вам также может понравиться

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

  1. Вот бы то же самое, но для Ubuntu …

    И еще вопрос если можно — вы не пробовали использовать классификатор изображений применительно к реальному видео потоку с HD разрешением ?

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

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

закрыть

Поделиться

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

Вход

закрыть

Регистрация

+ =