Подписи к изображениям - это задача, которая включает в себя компьютерное зрение и обработку естественного языка. Он берет изображение и может описать происходящее на нем простым английским языком. Архитектор CNN используется для извлечения функций из изображений. Затем закодированное изображение пропускается через декодер. Поскольку RNN очень хороша с последовательными данными, и нам нужно описать изображение в предложении, чтобы мы могли использовать RNN или его вариант в качестве декодера.
Набор данных:
Я использовал набор данных flicker8k. Он содержит 8000 изображений. Каждое изображение имеет пять подписей. Модель была обучена на 6000 изображениях, и по 1000 изображений было сэкономлено для каждого набора Dev и Test.
Кодировщик:
Я использовал InceptionV3 в качестве кодировщика. Используя преимущества трансферного обучения, были использованы предварительно обученные веса начального уровня V3. Второй последний уровень начальной модели был новым выходом модели, поскольку мы хотим закодировать изображение в вектор.
Декодер:
Я использовал LSTM в качестве декодера. Краткое описание модели приведено ниже.
Это модель изображения, поскольку она берет закодированное изображение из начальной модели и использует полностью связанный слой для его масштабирования с 2048 до 300 измерений.
- Это языковая модель; Он получает один горячий вектор, который сначала преобразуется в вектор внедрения, а затем проходит через двунаправленный LSTM.
- Затем модель изображения и языковая модель объединяются и передаются через другой двунаправленный LSTM для вывода вектора размера словаря. Значение наибольшей вероятности словарного вектора - это следующее предсказанное слово.
Это были значения разных переменных.
Размер вложения = 300
Размер словарного запаса = 8256
Выпадение = 0,5
Оптимизатор = Адам
Размер партии = 128
Обучение:
Я тренировал модель за 13 эпох. Ниже приведены значения потерь для некоторых эпох.
11 эпох: 2108 с 703 мс / шаг - потеря: 1,3744 - точность: 0,605812 эпох: 2106 с 703 мс / шаг - потеря: 1,2529 - точность: 0,6332
13 эпох: 2097 с 700 мс / шаг - потеря: 1,1560 - точность: 0,6571
Это дало достойные результаты в 12 эпоху. Но на 13-й эпохе результаты немного испортились, поэтому дальше я не тренировался.
Примечание. Я обучил свою модель 10 эпохам, и она работала нормально. Но на следующий день модель давала результаты неподготовленной модели. Оказалось, что я сделал новый словарь и заменил предыдущий. Каждый раз, когда вы токенизируете новый словарь, этому же слову присваивается новый индекс. Так что мне пришлось заново тренировать свою модель. Это будет иметь больше смысла, когда вы изучите код.
Тестирование:
Я использовал жадный поиск и лучевой поиск, чтобы предсказать результаты. В отличие от жадного поиска, когда мы выбираем только самую высокую вероятность получить предсказание следующего слова, при лучевом поиске мы выбираем столько слов, сколько хотим, каждый раз, когда он делает предсказание. Предположим, мы выбрали три слова, тогда мы учтем вероятность целой подписи, используя по отдельности первое слово, второе слово и третье слово. Мы выбираем это одно слово в зависимости от того, что дает нам максимальную вероятность подписи.
Если вы хотите узнать больше о поиске лучей, вы можете найти видео Эндрю Нг здесь.
Результаты:
Иногда Beam Search помогает.
Пожалуйста, поделитесь своими отзывами о проекте. Спасибо
Ссылка на репозиторий Github: https://github.com/Faizan-E-Mustafa/Image-Captioning
Ссылка на профиль LinkedIn: https://www.linkedin.com/in/faizan-mustafa-320b79156/