
Содержание статьи
Коул Мюррей

В моем последнем руководстве вы узнали, как создать конвейер распознавания лица в Tensorflow с помощью сверточных нейронных сетей. В этом руководстве вы узнаете, как a сверточная нейронная сеть (CNN) и Долгосрочная память (LSTM) можно объединить для создания генератора подписей к изображениям и создания подписей для ваших собственных изображений.
Обзор
- Введение в архитектуру модели субтитров изображений
- Подписи как проблема поиска
- Создание подписей в Tensorflow
Предпосылки
- Базовое понимание сверточных нейронных сетей
- Базовое понимание LSTM
- Базовое понимание Tensorflow
Введение в архитектуру модели подписей к изображениям
Сочетание CNN и LSTM
В 2014 году исследователи из Google выпустили статью «Покажи и расскажи: нейронный генератор подписей к изображениям». В то время эта архитектура была самой современной в наборе данных MSCOCO. Он использовал CNN+LSTM для ввода изображения и вывода подписи.

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

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

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

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

Титры как проблема поиска
Создание подписи можно рассматривать как задачу поиска по графику. Здесь узлы – это слова. Ребра – это вероятность перехода от одного узла к другому. Поиск оптимального пути предполагает максимизацию всеобщей вероятности предложения.
Выборка и выбор наиболее вероятного следующего значения являются жадным подходом к созданию подписи. Это вычислительно эффективно, но может привести к неоптимальному результату.
Учитывая все возможные слова, вычислить все возможные предложения и определить оптимальное предложение было бы неэффективно с точки зрения вычислений/пространства. Это исключает использование такого алгоритма поиска, как поиск сначала в глубину или поиск сначала в ширину, чтобы найти оптимальный путь.

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

Обзор
К этому моменту вы научились создавать архитектуру модели для создания предложения на основе изображения. Это делается путем использования CNN для создания плотного встраивания и передачи этого в качестве исходного состояния в LSTM. Кроме того, вы научились создавать лучшие предложения с помощью поиска по лучу.
В следующем разделе вы научитесь создавать подписи из предварительно обученной модели в Tensorflow.
Создание титров в Tensorflow
# Project Structure
├── Dockerfile├── bin│ └── download_model.py├── etc│ ├── show-and-tell-2M.zip│ ├── show-and-tell.pb│ └── word_counts.txt├── imgs│ └── trading_floor.jpg├── medium_show_and_tell_caption_generator│ ├── __init__.py│ ├── caption_generator.py│ ├── inference.py│ ├── model.py│ └── vocabulary.py└── requirements.txt
Настройка среды
Вот, вы будете использовать Docker установить Tensorflow.
Docker – это контейнерная платформа, упрощающая развертывание. Это решает проблему установления программных зависимостей на разные серверные среды. Если вы новичок в Docker, вы можете прочитать больше здесь. Чтобы установить Docker, запустите:
curl | sh
После установки Docker вы создадите два файла. А требования.txt для зависимостей Python и a Dockerfile чтобы создать среду Docker.
Чтобы создать это изображение, запустите:
$ docker build -t colemurray/medium-show-and-tell-caption-generator -f Dockerfile .
# On MBP, ~ 3mins# Image can be pulled from dockerhub below
Если вы хотите избежать создания из источника, изображение можно получить из dockerhub с помощью:
docker pull colemurray/medium-show-and-tell-caption-generator # Recommended
Загрузите модель

Ниже вы загрузите модельный график и предварительно подготовленные весы. Эти весы взяты из обучающего сеанса на наборе данных MSCOCO для итераций 2 мм.
Чтобы загрузить, запустите:
docker run -e PYTHONPATH=$PYTHONPATH:/opt/app -v $PWD:/opt/app \-it colemurray/medium-show-and-tell-caption-generator \python3 /opt/app/bin/download_model.py \--model-dir /opt/app/etc
Далее создайте класс модели. Этот класс отвечает за загрузку графика, создание встроенных изображений и выполнение шага вывода на модели.
Загрузите словарный запас
При обучении LSTM стандартной практикой является маркировка входных данных. Для модели предложения это означает сопоставление каждого уникального слова с уникальным числовым идентификатором. Это позволяет модели использовать классификатор softmax для прогнозирования.
Ниже вы загрузите словарный запас, используемый для обученной модели, и создайте класс, чтобы загрузить его в память. Здесь номер строки представляет числовой идентификатор маркера.
# File structure# token num_of_occurrances
# on 213612# of 202290# the 196219# in 182598
curl -o etc/word_counts.txt https://raw.githubusercontent.com/ColeMurray/medium-show-and-tell-caption-generator/master/etc/word_counts.txt
Чтобы сохранить этот словарь в памяти, вы создадите класс, ответственный за сопоставление слов с идентификаторами.
Создание генератора титров
Для создания субтитров сначала создайте генератор субтитров. Этот генератор субтитров использует поиск по лучу для улучшения качества сгенерированных предложений.
На каждой итерации генератор передает предыдущее состояние LSTM (начальное состояние – это встраивание изображения) и предварительную последовательность для создания следующего вектора softmax.
Первые N наиболее вероятных кандидатов сохраняются и используются на следующем этапе заключения. Этот процесс продолжается, пока не будет достигнута максимальная длина предложения или пока все предложения не сгенерируют маркер конца предложения.
Далее вы загрузите модель шоу и рассказов и используете ее с вышеприведенным генератором заголовков для создания предложений-возможностей. Эти предложения будут опубликованы вместе с их логарифмической вероятностью.
Результаты
Чтобы создать подписи, необходимо передать одно или несколько изображений в сценарий.
docker run -v $PWD:/opt/app \-e PYTHONPATH=$PYTHONPATH:/opt/app \-it colemurray/medium-show-and-tell-caption-generator \python3 /opt/app/medium_show_and_tell_caption_generator/inference.py \--model_path /opt/app/etc/show-and-tell.pb \--input_files /opt/app/imgs/trading_floor.jpg \--vocab_file /opt/app/etc/word_counts.txt
Вы должны увидеть результат:
Captions for image trading_floor.jpg: 0) a group of people sitting at tables in a room . (p=0.000306) 1) a group of people sitting around a table with laptops . (p=0.000140) 2) a group of people sitting at a table with laptops . (p=0.000069)

Вывод
В этом руководстве вы узнали:
- как соединить свертную нейронную сеть и LSTM для создания подписей к изображению
- как использовать алгоритм поиска по лучу, чтобы рассмотреть несколько подписей и выбрать наиболее вероятное предложение.
Полный код здесь.
Следующие шаги:
Призыв к действию:
Если вам понравился этот учебник, следуйте и рекомендуйте!
Хотите узнать больше о Deep Learning / Machine Learning? Просмотрите другие мои учебники:
— Создание конвейера распознавания лица с глубоким обучением в Tensorflow
— Глубокое обучение CNN в Tensorflow с графическим процессором
— Глубокое обучение с Keras на Google Compute Engine
— Системы рекомендаций по Apache Spark на Google Compute Engine
Другие места, где вы можете найти меня:
— Twitter: