Внутри ИИ

Подписание изображений с помощью набора данных Flickr8k и BLEU

Оглавление:

  1. Вступление
  2. Почему набор данных Flickr8k
  3. Давайте разбираться в данных
  4. EDA…
  5. Как придать фигурам изображения ..?
  6. Предварительная обработка титров…
  7. Последовательная подготовка данных
  8. BLEU…?
  9. Вывод
  10. Заключение
  11. использованная литература

1. Введение:

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

Подписи к изображениям - это приложение от одной ко многим RNN. для заданного входного изображения модель предсказывает заголовок на основе словаря данных поезда. Мы рассматриваем набор данных Flickr8K для этого тематического исследования. Официальный сайт данных не работает, но спасибо Джейсону Браунли. Здесь вы можете скачать набор данных.

2. Почему набор данных Flickr8k…?

  1. Он небольшой по размеру. Так что модель можно легко обучить на ноутбуках / десктопах бюджетного класса ...
  2. Данные правильно помечены. Для каждого изображения предусмотрено 5 подписей.
  3. Набор данных доступен бесплатно.

3. Давайте разбираться в данных…

Предварительная обработка и очистка данных - важная часть всего процесса построения модели. Понимание данных помогает нам строить более точные модели.

После распаковки zip-файлов вы найдете следующие папки…

  1. Flickr8k_Dataset: содержит в общей сложности 8092 изображения в формате JPEG различных форм и размеров. Из них 6000 используются для обучения, 1000 - для тестирования и 1000 - для развития.
  2. Flickr8k_text: содержит текстовые файлы, описывающие train_set, test_set. Flickr8k.token.txt содержит 5 подписей для каждого изображения, то есть всего 40460 подписей.

4. EDA…

У нас есть в основном два типа данных.

  1. Изображений
  2. Подписи (текст)

Объем обучающего словаря составляет 7371. 10 самых часто встречающихся слов:

('a', 46784),('in', 14094),('the', 13509),('on', 8007),('is', 7196),
('and', 6678),('dog', 6160),('with', 5763),('man', 5383),       ('of', 4974)

Поскольку слова, которые встречаются очень редко, не несут большой информации. Мы рассматриваем слова с частотой более 10.

Топ-50 слов распределяются следующим образом ...

Здесь с распределением наименее частого слова, которое мы удалили ранее

Средняя длина подписи к изображению во время обучения

Среднее значение, стандартное отклонение и процентили выглядят следующим образом ...

count    6000.000000
mean       10.815467
std         2.057137
min         4.200000
25%         9.400000
50%        10.600000
75%        12.200000
max        19.200000

Максимальная найденная длина последовательности 37.

5. Как придать фигурам изображения…?

Уже есть предварительно обученные модели на стандартном наборе данных Imagenet, представленные в keras. Imagenet - это стандартный набор данных, используемый для классификации. Он содержит более 14 миллионов изображений в наборе данных с немногим более 21 тысячи групп или классов.

Мы будем использовать InceptionV3 от Google. С исследовательской работой можно ознакомиться здесь.

Почему Начало…?

  1. Он имеет файл меньшего веса, то есть около 96 МБ.
  2. Тренироваться быстрее.

Мы удалим начало формы слоя soft-max, поскольку мы хотим использовать его как средство извлечения функций. Для заданного входного изображения начало дает нам 2048 размерных извлеченных векторов. Код следующий

Для каждого обучающего изображения мы изменяем его размер до (299 299), а затем передаем его в Inception для извлечения признаков. Не забудьте сохранить словарь train_image_extracted. если вы настраиваете модель, это сэкономит много времени.

6. Предварительная обработка титров ...

Каждое изображение в наборе данных снабжено 5 заголовками. Например, изображение 1000268201_693b08cb0e.jpeg имеет подписи

['A child in a pink dress is climbing up a set of stairs in an entry way .',
 'A girl going into a wooden building .',
 'A little girl climbing into a wooden playhouse .',
 'A little girl climbing the stairs to her playhouse .',
 'A little girl in a pink dress going into a wooden cabin .']

Подписи считываются из файла Flickr8k.token.txt и сохраняются в словаре k: v, где k = идентификатор изображения, а значение = [список подписей].

Поскольку для каждого изображения есть 5 подписей, мы предварительно обработали и закодировали их в формате ниже

«Startseq» + заголовок + «endseq»

Причина использования startseq и endseq заключается в следующем:

startseq: будет действовать как наше первое слово, когда вектор изображения извлеченного объекта подается в декодер. Это запустит процесс создания субтитров.

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

7. Последовательная подготовка данных…

Это непростая часть. как преобразовать эти данные в последовательную форму ..?

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

Сначала скармливаем изображение в начало и получаем объект, извлеченный 2048 размерным вектором.

caption: startseq группа людей, плавающих в воде endseq.

мы сформируем последовательность, как показано ниже.

Image_vector + ['startseq']
Image_vector + ['startseq', 'a']
Image_vector + ['startseq', 'a', 'bunch']
Image_vector + ['startseq', 'a', 'bunch', 'of']
Image_vector + ['startseq', 'a', 'bunch', 'of', 'people']
Image_vector + ['startseq', 'a', 'bunch', 'of', 'people','swimming']
...

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

Эта проблема….?

Если мы подгоняем для модели сразу все точки данных, возникает проблема. Так как у нас всего 40к подписей.

Максимальная длина заголовка - 37. Таким образом, каждый заголовок закодирован в последовательность из 37.

Предположим, что в среднем для кодирования последовательности нам нужно 10 строк.

И каждое слово в последовательности будет встроено в 300-мерный вектор перчатки.

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

40k x 10x ((37 x 200) + 2048) === ›прибл. Не менее 3,7 ГБ.

Решение:

Вместо того, чтобы получать данные целиком за один раз, используйте data_generator для генерации данных партиями.

8. BLEU…?

BLEU расшифровывается как Bilingual Evaluation Understudy.

Это алгоритм, который использовался для оценки качества машинного перевода текста. Мы можем использовать BLEU для проверки качества сгенерированной подписи.

  • BLEU не зависит от языка
  • Легко понять
  • Это легко вычислить.
  • Он находится между [0,1]. Чем выше оценка, тем лучше качество подписи

Как рассчитать балл BLEU…?

прогнозируемый заголовок = "хорошая погода"

ссылки:

  1. небо чистое
  2. погода очень хорошая

сначала преобразуйте предсказанный заголовок и ссылки в униграммы / биграммы.

BLEU показывает, насколько хорошо наш прогнозируемый заголовок по сравнению с предоставленными 5 ссылочными заголовками.

9. Заключение…

Для данной функции извлечено тестовое изображение и startseq как i / p для моделирования, мы получаем распределение вероятности по всем словам в словаре. Слово, соответствующее индексу максимальной вероятности, является предсказанным словом.

Мы перестаем предсказывать, когда появится слово «endseq».

Вот несколько примеров моего ноутбука с ipnb ...

  • Прогноз очень хороший. Он правильно описывает изображение. Соблюдайте значение BLEU

  • Ребенок предсказан правильно, но модель рассматривает взрослых как детей. Здесь значение BLEU падает, поскольку прогноз не аналогичен ссылкам.

  • Не очень хороший. BLEU очень маленький, близок к нулю, за исключением юниграммы.

  • Нееет… не очень хороший.

  • Хорошая попытка, но неточная подпись. Обратите внимание на высокое значение униграммы

  • Женщину предсказали как маленького мальчика.

10. Заключение:

  1. Производительность модели можно улучшить, обучив ее на более крупном наборе данных и настроив гиперпараметры.
  2. Сверху мы можем видеть, что оценки unigram bleu предпочитают короткие прогнозы.
  3. Прогноз хороший, если все баллы BLEU высокие.

Это с моей стороны…!

Полный код можно найти в блокноте ipython здесь.

Конец.

11. Ссылки:

  1. Https://towardsdatascience.com/intuitive-understanding-of-attention-mechanism-in-deep-learning-6c9482aecf4f?%24Ga=true
  2. Http://karpathy.github.io/2015/05/21/rnn-effectiveness/
  3. Https://fairyonice.github.io/Develop_an_image_captioning_deep_learning_model_using_Flickr_8K_data.html
  4. Http://cs231n.github.io/transfer-learning/