* Тільки для вивчення Machine Learning, очевидно. Під трохи незадоволеним поглядом коханої дружини.
Напевно, немає настільки простого рівня спинно-мозкових рефлексів додатків, як Tinder. Для того, щоб ним користуватися достатньо одного пальця, щоб свайпать і трохи нейронів, щоб вибирати дівчат або чоловіків, які тобі більше подобаються. Ідеальна реалізація брутфорсу у виборі пари.
Я вирішив, що це непоганий спосіб трохи помацати машинне навчання на новій відеокарті. Залишиться тільки пояснити дружині, що мені не потрібна товща нова жінка, а я просто треную нейромережі.
У чому проблема мереж для знайомств
Був такий ресурс – Ashley Madison. Специфічний, із гаслом «Life is short. Have an affair». Основна аудиторія - одружені чоловіки, які шукають собі інтрижку на стороні. Монетизація теж весела - крім стандартних "витратити бали, щоб лайкнути і написати" вони просили $19, щоб видалити обліковий запис користувача без слідів.
У 2015 році сайт закономірно протік і 60 ГБ персональних даних вибігли у відкритий доступ. Крім безлічі зруйнованих сімей, цей витік дав дуже багато цікавої інформації аналітикам. Я завжди підозрював, що чоловіків на сайтах знайомств набагато більше, але в цьому випадку дуже цікаво. Журналістка Annalee Newitz,
Подібна перевага у бік чоловічих облікових записів характерна не тільки для цього ресурсу, але і для більшості інших сайтів знайомств. Впевнений, що багато хто стикався з цією безсумнівно несправедливою ситуацією, коли тобі доводиться старанно продумувати знайомство, а дівчині досить просто зареєструватися. Якість цього натовпу шанувальників залишимо осторонь, але факт безперечний, баланс попиту та пропозиції явно зміщений на користь дівчат.
Особливість Tinder
Ідеальний брутфорсер у гендерних відносинах
Основна риса цієї платформи саме в низьких витратах на одне знайомство. Достатньо збігу двох свайпів і ви вже спілкуєтеся з потенційно цікавою людиною. Проблема в тому, що та сама гендерна диспропорція призводить до того, що більшість дівчат мають десятки збігів на добу. Це означає, що їм, швидше за все, буде колись звертати на вас увагу серед інших кандидатів.
Цілком зрозуміло, що платформа має на увазі мало можливостей оцінити глибокий внутрішній світ людини за півторасекундним поглядом на фотографію в купальнику або за кермом модного тонованого автомобіля. Тому, якщо ви не виглядаєте просто божественно на своїх фотографіях, вам не залишається нічого іншого, як збільшити свої шанси, перейнявши
збираємо дані
Перш за все, вам потрібно дуже багато даних для нормальної точності. Будь-хто, хто стикався з машинним навчанням, знає, як складно буває набрати коректно зібраний і розмічений датасет. Теоретично, як джерело даних підійде будь-який подібний ресурс, будь то Instagram або інші соціальні мережі. Але найкраще навчати саме на тих зразках, на яких мережа працюватиме надалі.
За основу візьмемо репозиторій
from skimage.io import imread, imsave, imshow, show
import matplotlib.pyplot as plt
import pynder
from helpers import get_access_token, get_login_credentials
from io_helper import save_image
email, password, FBID = get_login_credentials()
FBTOKEN = get_access_token(email, password)
session = pynder.Session(facebook_token=FBTOKEN)
while True:
users = session.nearby_users()
for user in users:
photos = user.get_photos()
print("Fetched user photos..")
for photo in photos:
print(photo)
image = imread(photo)
imshow(image)
show()
input_string = "Write 1 to like. Write 2 to dislike."
ans = str(input(input_string)).lower()
if ans == "1":
save_image(image, photo, True)
else:
save_image(image, photo, False)
Він дозволить вам максимально швидко розмітити датасет лише двома кнопками. Ключовий підводний камінь полягає в тому, що бібліотека werkzeug зламала зворотну сумісність і доведеться робити її примусовий даунгрейд. Інакше вивалює ось таку помилку.
Traceback (most recent call last):
File "img_scrape.py", line 4, in <module>
from helpers import get_access_token, get_login_credentials
File "/home/someone/tmp/TinderAutomation/helpers.py", line 1, in <module>
import robobrowser
File "/home/someone/tmp/TinderAutomation/venv/lib/python3.6/site-packages/robobrowser/__init__.py", line 3, in <module>
from .browser import RoboBrowser
File "/home/someone/tmp/TinderAutomation/venv/lib/python3.6/site-packages/robobrowser/browser.py", line 8, in <module>
from werkzeug import cached_property
ImportError: cannot import name 'cached_property'
Тому в requirements.txt треба прописати Werkzeug==0.16.1. Тоді злетить.
Друга проблема — добути цей токен. Стандартний спосіб з репозиторію у мене не злетів, але вдалося видобути його з консолі розробника. Для цього переходимо по
Вимоги до датасету
Є кілька ключових вимог до датасет машинного навчання:
- Достатність
- Рівномірність
- різноманітність
Достатність у разі вимагає щонайменше 10000 фотографій для побудови адекватної моделі. Так, це дуже багато. Саме тому й існують послуги начебто
З різноманітністю проблем особливо немає, всі фотографії представлені у різноманітних ракурсах та освітленні. В окулярах, сукнях, купальниках та лижних костюмах. Проблема може виникнути з рівномірністю датасету. В ідеалі, коли ми розмітимо нашу вибірку, вона має складатися з приблизно рівних частин. Якщо у вас вийшов «перекошений» датасет, його доведеться розбавляти фотографіями з інших джерел. Більше симпатичних треба буде додати або навпаки ви визначите за результатом розмітки. У мене вийшло щось у районі 60% симпатичних. Чи то я не надто перебірливий, чи мені просто пощастило і навколо багато симпатичних дівчат.
Я також не відкидаю гіпотезу, що серед них багато ботів. Навчаємо бота, який лайкатиме інших ботів. У цьому є якась іронія.
Обробка даних
Ми маємо купу розмічених фотографій, але вони дуже різношерсті. Денні, нічні, зі спини та інші. З жалем розумію, що навчати на фотографіях зі зворотного ракурсу особливо не вийде, оскільки вибірка буде нерівномірною. Тому оптимальним варіантом буде використання осіб як опорної ознаки «симпатичності». Все ж таки для нас, як і для інших приматів, це ключовий параметр.
Тому скористаємося
Докладніше це описано в мануалі до
На наступному етапі, після того, як у вибірці виявляться лише обличчя, має сенс усунути колір. Насправді, вам навряд чи доведеться вибирати між прекрасно-блакитною мешканкою Пандори чи зеленошкірою красунею.
У людей Hue параметр у кольорі шкіри не привносить значного внеску в оцінку привабливості.
Тому варто просити роботу нейромережі і залишити тільки рожевийскаль.
Побудова моделі
Відразу хочу сказати, що без хорошої відеокарти та CUDA ви, швидше за все, просто не отримаєте навчену модель в адекватні терміни. Тому відразу націлюйтеся на розрахунки у спеціалізованих хмарах або з використанням python-CUDA.
Я взяв базовий тришаровий приклад у автора репозиторію і, на диво, він показав точність у районі 72%, що є цілком добрим результатом.
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'])
Якщо є хороша вибірка, її цілком може виявитися достатньо для отримання придатної для роботи моделі.
Запускаємо бота
Дякуємо автору репозиторію за готовий варіант для швидкої перевірки ідеї. Насправді цілком працює в базовому варіанті і можна, в принципі, запустити на нашому
Результати
Напевно, я дуже симпатичний. І маю багатий внутрішній світ. Отримав щось у районі 13 збігів протягом години. Причому кілька разів дівчата писали першими.
У результаті виходили дуже милі діалоги, де я розповідав, що зайшов виключно пограти з машинним навчанням та розміткою даних. Одна з дівчат дуже зацікавилася, оскільки сама розробник. Є стійке відчуття, що вона зрештою прочитає цю посаду на Хабрі. Я дуже сподіваюся, що Оксана збереже мою анонімність. 🙂
* махає лапою і передає привіт
Трохи про етичний бік питання
Чесно кажучи, мені взагалі не подобається сама ідея роботизації стосунків між чоловіками та дівчатами. Є щось дуже правильне в тому, щоб накинути свою куртку на плечі до замерзлої незнайомої дівчини, яка стоїть на самоті. Або підійти до симпатичної дівчини у літньому кафе та разом випити кави. Вилазьте вже через монітори.
Навколо літо. Час знайомитися.
Джерело: habr.com