Фон

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

«Нейронный рассказчик - это повторяющаяся нейронная сеть, которая генерирует небольшие рассказы об изображениях» - Джейми Райан Кирос

Ссылка: https://github.com/ryankiros/neural-storyteller

Цели проекта

  1. Обновить код с Python 2 до Python 3+
  2. Воссоздайте оригинальный проект, который был натренирован на романтические романы.
  3. Поскребите детские сказки
  4. Обучите декодер пропущенных мыслей через RNN по детским рассказам, чтобы создавать данные о предвзятости стиля
  5. Собирайте метки и подписи к изображениям из Microsoft Azure Vision API.
  6. Выведите рассказ для детей, основанный на вводе одного изображения.
  7. Сравните результаты для жанров романов и детских рассказов

Сбор данных

Первоначальный план состоял в том, чтобы очистить детские книги (в формате PDF) от SmashWords (как рекомендовано Джейми), но мы столкнулись с проблемами при получении текстового описания библиотек Python и PyPDF2 для извлечения всех слов из данного PDF-файла. Вместо этого мы сосредоточились на парсинге веб-сайтов, истории которых были доступны в формате HTML. Используя расширение Web Scraper через Google Chrome, мы смогли собрать детские истории из нескольких источников. Вот пример графа селектора, который мы использовали для навигации по веб-страницам сайта:

После того, как мы собрали данные в один файл, мы запустили его в nltk, чтобы разбить данные на предложения. Благодаря этому подходу размер нашего набора данных увеличился почти до 45 000 предложений. Следующие веб-сайты были очищены в рамках нашего процесса сбора данных:

Ресурсы

Мы смогли настроить Jupyter Notebook в качестве экземпляра Google Cloud, следуя руководству Амульи Аанкул.

ПРИМЕЧАНИЕ. Мы увеличили размер образа диска до 100 ГБ после утечки памяти на диске 10 ГБ.

Настройка модели

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

Во время настройки модели мы столкнулись с трудностями при обучении изображений и подписей Общие объекты в контексте (COCO). На изображении выше подробно показано, как Vision Deep CNN генерирует подписи с помощью RNN, генерирующего язык, на последнем уровне. Учитывая наши временные ограничения для этого проекта, мы решили использовать Microsoft Azure's Vision API, который генерировал несколько меток изображений и одну подпись. Затем мы объединили метки изображения в одну подпись, чтобы мы могли ввести две подписи. Позже в этом посте мы предоставили два примера. В модели Джейми набор данных COCO содержит пять заголовков. Мы предполагаем, что эта разница в количестве подписей повлияла на способность нашей модели разработать более точную грамматику и более подходящий стиль для детских рассказов.

Упомянутая выше функция позволила нам связать заголовки из Vision API с рассказом, созданным моделью. Формула была построена с использованием трех разных векторов:

  • X = подпись к изображению.
  • C = вектор «стиль подписи»
  • B = вектор «книжный стиль»

Как подробно описала Джейми в своем проекте, векторы пропуска мыслей чувствительны к следующим факторам:

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

Рабочий процесс

Наконец, мы смогли упаковать все компоненты в единую модель.

  1. Отправьте изображение в Microsoft Azure Vision API
  2. Microsoft Azure Vision API выводит метки изображений и заголовок: на этом этапе мы объединили метки изображения, чтобы они были представлены модели в виде заголовка.
  3. Отправка меток изображений и подписи в модель. С двумя подписями, одна предоставляется Vision API, а другая объединяется из меток изображений, мы отправляем их модели вместе со стилем (или жанром истории в этом проект)
  4. Модель выводит рассказ

Результаты

Вообще говоря, объем содержания романтических рассказов (созданных моделью) был намного выше, чем у рассказов для детей. Изображения актерского состава «Друзья» и пиццы были представлены в рамках нашего теста. См. Результаты ниже:

Друзья: составные изображения и подписи

[«Группа людей, позирующих, фотография, стоящая, сидящая у окна, женщина, мужчина, держащая костюм, торт, обеденный стол», «Мэтт Леблан, Лиза Кудроу, Кортни Кокс, Дэвид Швиммер, Дженнифер Энистон позируют для фото»]

Друзья: Романтическая история

Джесс думала, что это никогда не будет моей ошибкой, она улыбнулась и позволила Кэт снова прикоснуться к своим эмоциям, прежде чем она повернула голову и позволила ему войти в душ, как только она позволила ему прикоснуться к себе, Анна быстро вернула свое внимание для меня, зная, что он мог быть единственным разом до того, как она вошла в мой пентхаус, заставив Лив снова покраснеть. Сколько раз мне нужно выяснять, почему моя мама собиралась выйти за него замуж? Не радуйтесь, что она была моим любимым украшением. Фото фото фотоальбом был идеальным, но чувствовал себя идеально. Она указала на меня указательным пальцем, а указательным - к моим губам. Не меняй мой костюм. Единственная другая женщина, которую я когда-либо встречал, была сексуальной и сексуальной, как и два других мужчины, участвовавшие в свадебной церемонии. А моя мама, Нэт, Мел Миллер, казалось, считала, что выбрала идеальную брюнетку.

Друзья: детская история

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

Пицца: ярлыки и подписи к составным изображениям

[«Фото пицца, еда, разные сидячие коробки, стол, черная пара, тарелка, различные мясные начинки, сервировка, фиолетовая сковорода», «пицца, сидящая на сковороде»]

Пицца: романтическая история

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

Пицца: детская история

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

Проблемы

  • Нахождение подходящего количества обучающих данных. Оглядываясь назад, мы должны были выбрать жанр рассказа, который будет иметь значительный объем данных.
  • Обработка данных (удаление пустых строк, кодирование и т. Д.)
  • Настройка экземпляров Google Cloud
  • Поиск и извлечение детских рассказов из нескольких источников.
  • Соответствие кодировки наборов данных
  • Воссоздание оригинального проекта с более новыми версиями
  • Настройка экземпляра Google Cloud
  • Обучение модели
  • В исходном проекте для создания подписей к изображениям использовались подписи к изображениям COCO.

Выводы

  • Изучите источники данных, прежде чем выбирать один жанр. В нашем случае мы думали, что сможем найти важные данные для обучения модели на детских рассказах, но было лишь определенное количество бесплатных веб-сайтов, которые можно было очистить.
  • Чем больше данных, тем лучше (модель). Первоначальная модель Джейми была обучена на 14 миллионах отрывков, в то время как наша модель опиралась на 48 тысяч предложений.
  • GPU над CPU. Мы потратили значительное количество времени на настройку нашей модели на наших локальных машинах, тогда как мы могли бы начать с экземпляра Google Cloud ранее в проекте.

Дальнейшая работа

Поразмыслив, мы обсудили несколько возможностей улучшить нашу модель. Во-первых, интересное дополнение, предложенное нашим профессором, доктором Алексом Димакисом, заключалось в том, чтобы убедиться, что каждое слово, заданное в качестве входных данных (в подписях), будет включено в сгенерированный рассказ. Еще одна вещь, которую следует учитывать, - это порядок обучения модели. Учитывая, что исходная модель была обучена романтическим историям, во-первых, мы предполагаем, что грамматика и стиль выходных материалов коротких рассказов будут приближены к детским рассказам, если мы обучаем любовные рассказы в последнюю очередь. Это также может иметь место из-за большого расхождения в размерах наборов данных. Как упоминалось ранее, набор данных любовного романа содержал более 14 миллионов отрывков, в то время как набор данных наших детских рассказов содержал 48 000 предложений. В тандеме, возможно, стоит найти другой источник для более качественных субтитров.

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

Ссылки

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

Авторы Абхилаша Каниткар, Ануджа Шривастава и Мухамед Ндойе