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

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

Представьте, что вы идете в продуктовый магазин и сравниваете два одинаковых продукта питания, чтобы определить, какой из них полезнее. Вы смотрите на калории, в которых меньше углеводов или жиров, но с максимальным содержанием клетчатки и белка. 300 калорий в 30 г продукта A, по сравнению со 100 калориями в 55 г продукта B, несут 1… сколько углеводов опять же в A? После должного обучения модель машинного обучения может сразу дать вам ответ! Именно такие решения изначально заинтриговали меня, когда я действительно полюбил машинное обучение.

Это круто, потому что теоретически мы можем обучить программу тому, чтобы она узнавала что угодно, и это predict результаты проблемы! Осмелюсь ли сказать, колдовство !?

В своей попытке я испробовал много способов освоить машинное обучение, пройдя gold standard курс Эндрю Нг на Coursera, пройдя курсы по науке о данных и искусственному интеллекту, решая задачи Kaggle и следя за сообщениями в блогах для выполнения личных проектов. Все эти вещи не оправдались, потому что а) короткое время концентрации внимания и б) нужно было многому научиться, прежде чем на самом деле сделать что-то, что будет do machine learning.

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

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

Три вещи, которые я знаю, чтобы быть правдой

  1. Google создал удивительную сверточную нейронную сеть под названием Inception (v3), которая позволяет нам делать ее копию и повторно обучать ее последний слой, так что у нас есть machine learning model, который будет классифицировать наши собственные изображения.
  2. Для компании, которая предоставляет пул изображений для курирования наших клиентов, невероятно полезным упражнением было бы посмотреть, может ли наша модель предсказать, будет ли определенное изображение курироваться клиентом.
  3. Получить данные сложно, получить надежные данные ОЧЕНЬ сложно.

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

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

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

Еще три вещи, которые я знаю, чтобы быть правдой

  1. По шкале от единицы до чрезмерного доверия к своим данным я довольно наивен. Чтобы по-настоящему понять, что наша модель изучает и, таким образом, предсказывает, мы должны сначала увидеть результат ее вывода. Затем вернитесь и переучитесь.
  2. На этот раз выполнение проекта с машинным обучением было гораздо более увлекательным и доступным, потому что мы четко определили нашу постановку задачи, мы знали, какие инструменты использовать, и мы заботились о его результатах и ​​руководствовались ими.
  3. Машинное обучение - это страшно, особенно если вы учитесь для развлечения! Мне потребовалось время, чтобы сделать это, но проявите настойчивость, это окупится. Я обнаружил, что очень мотивирует работать над проблемой, которая вам небезразлична, а не общим «Hello World!» машинного обучения, которое предсказывает тип iris flower примера (да, я включил пример цветка в свой учебник).

Что я выучил

Хорошие данные определяются постановкой проблемы. Предсказание того, что будет курировать клиент, имеет БОЛЬШОЕ значение по отношению к данным. Такие вопросы, как "Has the client seen this picture before?" или "Is a previously curated picture still relevant after x amount of days?", важно учитывать при построении модели. Однако мы не ограничены этим результатом, это то, что, как мы ожидаем, мы узнаем со временем.

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

Сделай сам - погрузитесь в классификацию изображений

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

По сути, мы собираемся сделать use the Tensorflow library to retrain parts of the Inception model by using our own labeled data and then classify a new, unseen image and see what the model predicts.

Цели обучения

  • опыт работы с техникой машинного обучения supervised learning
  • переучить convolutional neural net
  • справиться с бинарным / мультиклассовым изображением classification (бинарный - две метки, мультикласс - больше двух)

Ингредиенты

  • Докер
  • некоторые терминальные навыкиz
  • изображения, чем больше, тем лучше

Настройка среды

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

Скачайте Docker: https://www.docker.com/community-edition

После установки, если Docker еще не запущен, сделайте это вручную, запустив приложение или выполнив команду:

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

docker run -d -it --name <CONTAINER_NAME> -v <VOLUME_NAME>:/tf_files gcr.io/tensorflow/tensorflow:latest-devel
docker exec -it <CONTAINER_NAME> bash

Круто, Докер настроен.

exec позволяет подключаться по SSH к контейнеру Docker.

Получение данных

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

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

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

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

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

(while inside your Docker container)
mkdir /tf && cd /tf
curl -O http://download.tensorflow.org/example_images/flower_photos.tgz
tar xzf flower_photos.tgz
-----------------------------------------------------------------
(to copy images from your own drive to Docker)
docker cp <FOLDER_NAME> <CONTAINER_NAME>:/tf/<FOLDER_NAME>

Теперь ваши обучающие изображения будут находиться в /tf/flower_photos.

Следующая команда начнет обучение вашей модели изучению изображений:

cd /tensorflow && git pull
python /tensorflow/tensorflow/examples/image_retraining/retrain.py \
-- 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/flower_photos/

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

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

Теперь вы готовы классифицировать свои изображения. Вернитесь на свой локальный диск и возьмите где-нибудь изображение. Вы можете открыть новую вкладку на terminal.

Опять же, чтобы скопировать изображения, которые вы хотите классифицировать, с локального диска в Docker:

docker cp <FILE_NAME> <CONTAINER_NAME>:/tf/<FILE_NAME>

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

docker cp <CONTAINER_NAME>:/tf/label.py label.py

Итак, возьмите изображение, НЕ являющееся результатом обучения. Убедитесь, что ВЫ знаете, что это такое, а затем добавьте это в классификатор.

Вернитесь в контейнер Docker с помощью:

docker exec -it <CONTAINER_NAME> bash

а затем запустить скрипт python:

python /tf/label.py /tf/<SOME_IMAGE>.jpg

На рисунке выше показана модель, предсказывающая, что изображение одуванчика dandelion с достоверностью 99,8%.

Итак, теперь я спрашиваю вас, что может сделать для вас машинное обучение?