Этот пост является частью 12-месячного проекта ускоренного обучения Джеффа под названием Месяц, чтобы стать мастером. В марте он загружает возможность создания ИИ.

Если вам интересно узнать обо мне больше, загляните на мой сайт.

Вступление

На днях, когда я сидел в туалете, чтобы * какать *, я вытащил свой телефон и открыл король всех туалетных приложений: Tinder. Я открыл приложение и начал бессмысленное смахивание. * Левый * * Правый * * Левый * * Правый * * Левый *.

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

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

Я выгляжу выше среднего. Однако в море азиатских мужчин, судя по внешнему виду, мое лицо не появлялось на странице. На бирже у нас есть покупатели и продавцы. Лучшие инвесторы получают прибыль за счет информационных преимуществ. За покерным столом вы получаете прибыль, если у вас есть преимущество в навыках над другими игроками за вашим столом. Если мы думаем о свиданиях как о «конкурентном рынке», как вы дадите себе преимущество перед конкурентами? Конкурентным преимуществом может быть: потрясающая внешность, успех в карьере, социальная привлекательность, авантюрность, близость, большой круг общения и т. Д.

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

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

Хотя у меня нет ЛУЧШИХ изображений, мое основное узкое место в том, что у меня просто недостаточно высокой громкости смахивания. Я просто считаю, что бездумное свайпирование - пустая трата моего времени, и предпочитаю встречаться с людьми лично. Однако проблема в том, что эта стратегия сильно ограничивает круг людей, с которыми я мог бы встречаться. Чтобы решить эту проблему с объемом смахивания, я решил создать искусственный интеллект, который автоматизирует Tinder, под названием THE DATE-A MINER.

DATE-A MINER - это искусственный интеллект, который изучает профили знакомств, которые мне нравятся. Как только он выучит то, что мне нравится, DATE-A MINER автоматически проведет пальцем влево или вправо по каждому профилю в моем приложении Tinder. В результате это значительно увеличит объем смахивания и, следовательно, увеличит мою прогнозируемую рентабельность инвестиций в Tinder. Как только я добьюсь совпадения, ИИ автоматически отправит сообщение матчи.

Хотя это не дает мне конкурентного преимущества в фотографиях, это дает мне преимущество в объеме прокрутки и начальном сообщении. Давайте углубимся в мою методологию:

Сбор данных

Чтобы построить DATE-A MINER, мне нужно было накормить ее МНОГО изображений. В результате я получил доступ к Tinder API с помощью pynder. Этот API позволяет мне использовать Tinder через интерфейс терминала, а не через приложение:

Я написал сценарий, в котором я мог пролистывать каждый профиль и сохранять каждое изображение в папку «Нравится» или «Не нравится». Я часами просматривал и собрал около 10 000 изображений.

Я заметил одну проблему: я смахнул влево около 80% профилей. В результате у меня было около 8000 дизлайков и 2000 в папке лайков. Это сильно несбалансированный набор данных. Поскольку у меня так мало изображений для папки «Нравится», майнер не сможет понять, что мне нравится. Он будет знать только то, что мне не нравится.

Чтобы решить эту проблему, я нашел в Google изображения людей, которых я нашел привлекательными. Затем я соскребал эти изображения и использовал их в своем наборе данных.

Предварительная обработка данных

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

Чтобы решить эту проблему, я использовал Алгоритм каскадного классификатора Хаарса для извлечения лиц из изображений и затем сохранял их. Классификатор, по сути, использует несколько положительных / отрицательных прямоугольников. Пропускает его через предварительно обученную модель AdaBoost для определения вероятных размеров лица:

Алгоритму не удалось обнаружить лица примерно для 70% данных. Это сократило мой набор данных до 3000 изображений.

Моделирование

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

Для моделирования этих данных я использовал два подхода:

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

model = Sequential()
model.add(Convolution2D(32, 3, 3, activation=’relu’, input_shape=(img_size, img_size, 3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(32, 3, 3, activation=’relu’))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(64, 3, 3, activation=’relu’))
model.add(MaxPooling2D(pool_size=(2,2)))
 
model.add(Flatten())
model.add(Dense(128, activation=’relu’))
model.add(Dropout(0.5))
model.add(Dense(2, activation=’softmax’))
adam = optimizers.SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss=’categorical_crossentropy’,
 optimizer= adam,
 metrics=[‘accuracy’])

В результате точность составила около 67%.

Передача обучения с использованием VGG19: проблема с трехуровневой моделью заключается в том, что я обучаю CNN на СУПЕР малом наборе данных: 3000 изображений. Лучшая обучающая сеть cNN на миллионах изображений.

В результате я применил технику под названием «Трансферное обучение». Трансферное обучение - это, по сути, использование модели, построенной кем-то другим, на ваших собственных данных. Обычно это правильный путь, когда у вас очень маленький набор данных. Я заморозил первый 21 слой на VGG19 и просто тренировал два последних. Затем я расплющил и положил поверх него классификатор. Вот как выглядит код:

model = applications.VGG19(weights = “imagenet”, include_top=False, input_shape = (img_size, img_size, 3))
top_model = Sequential()
top_model.add(Flatten(input_shape=model.output_shape[1:]))
top_model.add(Dense(128, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(2, activation='softmax'))
new_model = Sequential() #new model
for layer in model.layers: 
    new_model.add(layer)
    
new_model.add(top_model) # now this works
for layer in model.layers[:21]:
    layer.trainable = False
adam = optimizers.SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True)
new_model.compile(loss='categorical_crossentropy',
              optimizer= adam,
              metrics=['accuracy'])
new_model.fit(X_train, Y_train, 
          batch_size=64, nb_epoch=10, verbose=2 )
new_model.save('model_V3.h5')

Результаты были:

Точность: 73%

Точность: 59%

Напомним: 44,61%

Точность - это просто предсказание, понравилось ли мне изображение правильно или нет.

Точность говорит нам: «Из всех профилей, которые предсказал мой алгоритм, были верными, сколько мне действительно понравилось?» Низкий показатель точности означает, что мой алгоритм бесполезен, поскольку большинство совпадений, которые я получаю, - это профили, которые мне не нравятся.

Напомним, он говорит нам: «Сколько из всех профилей, которые мне действительно нравятся, правильно спрогнозировал алгоритм?» Если этот балл низкий, это означает, что алгоритм чрезмерно разборчив.

Здесь вы можете увидеть алгоритм предсказания по Скарлет Йоханссон:

Запуск бота

Теперь, когда у меня есть алгоритм, мне нужно было подключить его к боту. Собрать бота было несложно. Здесь вы можете увидеть бота в действии:

Я намеренно добавил задержку от 3 до 15 секунд для каждого смахивания, чтобы Tinder не узнал, что в моем профиле запущен бот. К сожалению, у меня не было времени добавить в эту программу графический интерфейс.

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

Я дал себе всего месяц неполной занятости, чтобы завершить этот проект. На самом деле я мог бы сделать еще бесконечное количество вещей:

Обработка естественного языка для текста / интересов профиля: я мог бы извлечь описание профиля и интересы facebook и включить это в показатель оценки, чтобы разработать более точные смахивания.

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

Дополнительные данные. Я обучался только на 3000 изображениях. Если бы я мог тренироваться на 150 000 изображений Tinder, я уверен, что у меня был бы алгоритм, работающий на 80–90%. Кроме того, я мог бы улучшить программу извлечения лиц, чтобы не терять 70% своих данных.

Адаптировать к Hinge, Coffee Meets Bagel, Bumble: Чтобы расширить мое количество, адаптируйте алгоритм для охвата нескольких каналов.

A / B-тестирование: наличие платформы для AB-тестирования различных сообщений, изображений профиля и аналитики, поддерживающей эти различные решения.

Google's Inception, VGG16: это разные предварительно обученные cNN. Я хотел попробовать их, но у меня не хватило времени.

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

Пришло время провести пальцем по экрану!

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

Кредиты:

Читайте следующий пост.

Джефф Ли спасает мир, загружая матрицу в свой мозг. Он ……. «Суперучитель. ”

Если вы любите меня и этот проект, подпишитесь на этот средний аккаунт или загляните на мой сайт. Ненавидьте меня, вы все равно должны следить за этим средним аккаунтом. Один вариант здесь ……