* Выключна дзеля вывучэння 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 фатаграфій для пабудовы адэкватнай мадэлі. Так, гэта вельмi шмат. Уласна таму і існуюць сэрвісы накшталт
З разнастайнасцю праблем асабліва няма, усе фатаграфіі прадстаўлены ў разнастайных ракурсах і асвятленні. У акулярах, сукенках, купальніках і лыжных касцюмах. Праблема можа ўзнікнуць з раўнамернасцю датасета. У ідэале, калі мы размецім нашу выбарку, яна павінны складацца з прыблізна роўных частак. Калі ў вас атрымаўся «перакошаны» датасет, тое яго прыйдзецца разводзіць фатаграфіямі з іншых крыніц. Больш сімпатычных трэба будзе дадаць ці наадварот вы вызначыце па выніку разметкі. У мяне атрымалася нешта ў раёне 60% сімпатычных. Ці то я не занадта пераборлівы, ці то мне проста пашанцавала і вакол шмат сімпатычных дзяўчын.
Я таксама не адкідаю гіпотэзу, што сярод іх шмат робатаў. Навучальны робата, які будзе лайкаць іншых робатаў. У гэтым ёсць нейкая іронія.
апрацоўка дадзеных
У нас ёсць куча размечаных фатаграфій, але яны вельмі разнамасныя. Дзённыя, начныя, са спіны і іншыя. Са шкадаваннем разумею, што навучаць на фатаграфіях са зваротнага ракурсу асоба не атрымаецца, бо выбарка будзе моцна нераўнамерная. Таму, аптымальным варыянтам будзе выкарыстанне асоб, як апорнай прыкметы "сімпатычнасці". Усё ж такі для нас, як і для іншых прыматаў, гэта ключавы параметр.
Таму скарыстаемся
Больш падрабязна гэта апісана ў мануале да
На наступным этапе, пасля таго, як у выбарцы апынуцца толькі твары, мае сэнс прыбраць колер. Насамрэч, вам ці наўрад прыйдзецца выбіраць паміж выдатна-блакітнай жыхаркай Пандоры ці зялёнаскурай прыгажуняй.
У людзей Hue параметр у колеры скуры не прыўносіць значнага ўкладу ў адзнаку сімпатычнасці.
Таму, варта ўпрасіць працу нейрасеткі і пакінуць толькі grayscale.
Пабудова мадэлі
Адразу жадаю сказаць, што без добрай відэакарты і 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