*Oczywiście wyłącznie w celu uczenia się uczenia maszynowego. Pod lekko niezadowolonym spojrzeniem ukochanej żony.
Chyba nie ma aplikacji tak prostej do poziomu odruchów kręgosłupa jak Tinder. Aby z niego skorzystać, wystarczy przesunąć jednym palcem i kilka neuronów, aby wybrać dziewczyny lub mężczyzn, którzy najbardziej Ci się podobają. Idealna implementacja brutalnej siły przy wyborze par.
Zdecydowałem, że będzie to dobry sposób na zapoznanie się z uczeniem maszynowym na nowej karcie graficznej. Pozostaje mi tylko wytłumaczyć żonie, że nie potrzebuję nowej, grubszej kobiety, a jedynie trenuję sieci neuronowe.
Jaki jest problem z sieciami randkowymi?
Był taki zasób – Ashley Madison. Konkretny, pod hasłem „Życie jest krótkie. Mieć romans." Główną widownią są żonaci mężczyźni szukający romansu na boku. Zarabianie też jest fajne – oprócz standardowego „wydawania punktów na polubienie i pisanie” poprosili o 19 dolarów za usunięcie konta użytkownika bez śladu.
W 2015 r. witryna w naturalny sposób wyciekła, a 60 GB danych osobowych wyciekło do domeny publicznej. Oprócz wielu zniszczonych rodzin, wyciek ten dostarczył analitykom wielu interesujących informacji. Zawsze podejrzewałam, że na portalach randkowych jest dużo więcej mężczyzn, jednak w tym przypadku okazało się to całkiem interesujące. Dziennikarka Annalee Newitz
Taka przewaga kont męskich jest typowa nie tylko dla tego zasobu, ale także dla większości innych serwisów randkowych. Jestem pewien, że wielu spotkało się z tą niewątpliwie niesprawiedliwą sytuacją, kiedy trzeba dokładnie zaplanować znajomość, ale dziewczyna musi się tylko zarejestrować. Zostawmy jakość tej rzeszy fanów na boku, ale niezaprzeczalnym faktem jest, że równowaga podaży i popytu wyraźnie przechyla się na korzyść dziewcząt.
Funkcja Tindera
Idealny brutalny siłacz w relacjach płciowych
Główną cechą tej platformy jest niski koszt znajomości. Wystarczy zbieg okoliczności dwóch przeciągnięć i już komunikujesz się z potencjalnie interesującą osobą. Problem w tym, że ta sama nierównowaga płci prowadzi do tego, że większość dziewcząt będzie miała dziesiątki meczów dziennie. Oznacza to, że najprawdopodobniej nie będą mieli czasu, aby zwrócić uwagę na Ciebie wśród innych kandydatów.
Jest całkiem jasne, że platforma stwarza niewielkie możliwości oceny głębokiego wewnętrznego świata człowieka na podstawie półtorej sekundy spojrzenia na zdjęcie w kostiumie kąpielowym lub prowadzenie modnego przyciemnionego samochodu. Dlatego jeśli nie wyglądasz po prostu bosko na swoich zdjęciach, nie masz innego wyjścia, jak tylko zwiększyć swoje szanse poprzez adopcję
Zbieranie danych
Po pierwsze, do normalnej dokładności potrzebujesz dużo danych. Każdy, kto zetknął się z uczeniem maszynowym, wie, jak trudne może być utworzenie prawidłowo zebranego i oznaczonego zbioru danych. Teoretycznie każdy podobny zasób będzie odpowiedni jako źródło danych, czy to Instagram, czy inne sieci społecznościowe. Najlepiej jednak trenować na tych próbkach, na których sieć będzie działać w przyszłości.
Za podstawę weźmy repozytorium
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)
Pozwoli Ci to na jak najszybsze oznaczenie zbioru danych za pomocą zaledwie dwóch przycisków. Kluczowa pułapka polega na tym, że biblioteka werkzeug zepsuła kompatybilność wsteczną i konieczne będzie jej obniżenie. W przeciwnym razie zgłasza ten błąd.
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'
Dlatego w pliku wymagania.txt należy wpisać Werkzeug==0.16.1. Wtedy odleci.
Drugim problemem jest zdobycie tego właśnie tokena. U mnie standardowa metoda z repozytorium nie zadziałała, ale udało mi się ją pobrać z konsoli programisty. Aby to zrobić, przejdź do
Wymagania dotyczące zestawu danych
Istnieje kilka kluczowych wymagań dotyczących zbiorów danych uczenia maszynowego:
- Adekwatność
- Jednolitość
- Różnorodność
Wystarczalność w tym przypadku wymaga co najmniej 10000 XNUMX zdjęć, aby zbudować odpowiedni model. Tak, to dużo. Właśnie dlatego usługi lubią
Nie ma szczególnych problemów z różnorodnością, wszystkie zdjęcia prezentowane są pod różnymi kątami i oświetleniem. W okularach, sukienkach, strojach kąpielowych i kombinezonach narciarskich. Może pojawić się problem z jednolitością zbioru danych. Idealnie, gdy etykietujemy naszą próbkę, powinna ona składać się z mniej więcej równych części. Jeśli otrzymasz „wypaczony” zbiór danych, będziesz musiał go rozcieńczyć zdjęciami z innych źródeł. Będziesz musiał dodać bardziej atrakcyjne lub odwrotnie, określisz je na podstawie wyniku znaczników. Mam coś w około 60% ładnego. Albo nie jestem zbyt wybredny, albo po prostu mam szczęście i wokół jest mnóstwo ładnych dziewczyn.
Nie lekceważę też hipotezy, że botów jest wśród nich wiele. Szkolimy bota, który będzie lubił inne boty. Jest w tym pewna ironia.
Przetwarzanie danych
Mamy mnóstwo oznaczonych zdjęć, ale są one bardzo zróżnicowane. W dzień, w nocy, od tyłu i inne. Z żalem rozumiem, że nauczanie ze zdjęć pod odwrotnym kątem nie będzie szczególnie skuteczne, ponieważ próbka będzie bardzo nierówna. Dlatego najlepszą opcją byłoby użycie twarzy jako znaku odniesienia „słodkości”. Jednak dla nas, podobnie jak dla innych naczelnych, jest to parametr kluczowy.
Dlatego skorzystajmy
Bardziej szczegółowo opisano to w instrukcji
W kolejnym etapie, gdy w próbce znajdują się już same twarze, warto usunąć kolor. Tak naprawdę nie będziesz musiał wybierać pomiędzy pięknym niebieskim mieszkańcem Pandory a zielonoskórą pięknością.
U ludzi Hue kolor skóry nie ma znaczącego wpływu na ocenę atrakcyjności.
Dlatego warto uprościć pracę sieci neuronowej i pozostawić jedynie skalę szarości.
Budowa modelu
Chcę od razu powiedzieć, że bez dobrej karty graficznej i CUDA najprawdopodobniej po prostu nie dostaniesz wyszkolonego modelu w odpowiednim czasie. Dlatego od razu celuj w obliczenia w wyspecjalizowanych chmurach lub przy użyciu Pythona-CUDA.
Wziąłem od autora repozytorium podstawowy przykład trójwarstwy i, o dziwo, pokazał on dokładność na poziomie około 72%, co jest całkiem niezłym wynikiem.
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'])
Jeśli istnieje dobra próbka, może wystarczyć uzyskanie wykonalnego modelu.
Uruchommy bota
Dziękuję autorowi repozytorium za gotową opcję szybkiego przetestowania pomysłu. Tak naprawdę w wersji podstawowej sprawdza się całkiem nieźle i w zasadzie da się go uruchomić na naszym
wyniki
Chyba jestem bardzo uroczy. I mam bogaty świat wewnętrzny. W ciągu godziny udało mi się zdobyć około 13 meczów. Co więcej, kilka razy dziewczyny pisały jako pierwsze.
W rezultacie skończyło się na bardzo miłych dialogach, w których powiedziałem, że przyszedłem wyłącznie po to, aby pobawić się uczeniem maszynowym i etykietowaniem danych. Jedna z dziewcząt była niezwykle zainteresowana, ponieważ sama jest programistą. Istnieje silne przeczucie, że w końcu przeczyta ten post na Habré. Mam wielką nadzieję, że Oksana zachowa moją anonimowość. 🙂
*macha łapką i mówi cześć
Trochę o etycznej stronie problemu
Szczerze mówiąc, nie podoba mi się cały pomysł robotyzacji relacji między mężczyznami i dziewczynami. Jest coś bardzo słusznego w zarzuceniu kurtki na ramiona zmarzniętego nieznajomego, który stoi samotnie. Albo podejdź do ładnej dziewczyny w letniej kawiarni i wypijcie razem kawę. Wyjdź już zza monitorów.
Lato jest wszędzie. Czas się zapoznać.
Źródło: www.habr.com