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

Схема

Сбор данных

Создание модели трансферного обучения и ее сохранение

Получение рекомендаций

Создание пользовательского интерфейса и внедрение модели

Развертывание

Спойлер: я сделал статичную наивную модель, которая работает для некоторых статических изображений. Щелкните здесь, чтобы получить рекомендации!

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

Примечание: фрагменты кода добавляются, но для всего исходного кода Щелкните здесь.

Сбор данных

Сбор данных прост. Напишите код на Python, и ваши данные будут готовы. Я решил очистить свои собственные данные, но любой набор данных, содержащий коллекцию изображений продуктов, действительно хорош! У Kaggle есть много таких наборов данных.

Вот код для извлечения данных. Сначала я соскребал ссылки на изображения с веб-сайта, а затем загружал изображения.

Передача обучения

Трансферное обучение - это просто манипуляция и реализация модели, созданной для решения одной проблемы, которая используется для решения другой, но связанной проблемы. По сути, с помощью модели, используемой для классификации кошек и собак, для классификации гамбургеров и пиццы. Доступно множество моделей, а именно. Модели InceptionV3, VGG16, ResNet и все они служат одной цели, но имеют разную архитектуру. Я выбрал модель VGG16 для извлечения функций.

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

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

По сути, это создает служебную матрицу, которую можно использовать в дальнейшем для индексации изображений и получения наиболее похожих!

Ниже приведен код переноса обучения:

# load the model
vgg_model = vgg16.VGG16(weights='imagenet')

# remove the last layers in order to get features instead of predictions
feat_extractor = Model(inputs=vgg_model.input, outputs=vgg_model.get_layer("fc2").output)

# print the layers of the CNN
feat_extractor.summary()

Щелкните здесь, чтобы увидеть всю записную книжку!

Получение рекомендаций

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

Была использована следующая функция:

def retrieve_most_similar_products(given_img):

    print("-----------------------------------------------------------------------")
    print("original product:")

    original = load_img(given_img, target_size=(imgs_model_width, imgs_model_height))
    plt.imshow(original)
    plt.show()

    print("-----------------------------------------------------------------------")
    print("most similar products:")

    closest_imgs = cos_similarities_df[given_img].sort_values(ascending=False)[1:nb_closest_images+1].index
    closest_imgs_scores = cos_similarities_df[given_img].sort_values(ascending=False)[1:nb_closest_images+1]

Создание пользовательского интерфейса

Есть много вариантов создания интерфейсов, я выбрал Plotly-Dash просто потому, что он полностью написан на Python с небольшим CSS (Bootstrap). Учебники по тире на официальном веб-сайте довольно легко понять и внедрить. Я понял, как добавлять обратные вызовы и входы, выходы, и вот у меня появилась рабочая модель. Я, как человек творческий, не мог придумать цветовую схему за пару часов.

Так выглядит модель:

Развертывание

Приложения Dash обычно развертываются на Heroku. Я попробовал это сделать, но наткнулся на кучу ошибок и предупреждений. Оказывается, heroku допускает только до 500 МБ размера слага (размер прототипа), а размер моей модели составлял около 528 МБ. Таким образом, объем приложения составил около 800 мегабайт. Поэтому мне пришлось сгенерировать рекомендации для всех изображений в интерфейсе, статически хранить их и вызывать каждый раз, когда пользователь запрашивал одно из них. Это означало, что модель не использовалась напрямую для получения прогнозов, но, по крайней мере, приложение работало быстро и выполняло свою работу. Но модель можно использовать непосредственно на вашем локальном компьютере (я называю это динамическим пользовательским интерфейсом).

Вот развернутая модель: Товарные рекомендации👢

Для всего исходного кода:



Спасибо за чтение!