Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera

*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.

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera

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 analizowanie wyciekających danych odkryło, że spośród 5 milionów użytkowników tylko 12 000 było podobnych do kont prawdziwych dziewcząt i było używanych regularnie. Resztę stanowiły boty, które rozmawiały z męskimi gośćmi.

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

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i 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ę r-strategia u niektórych gatunków. Mówiąc najprościej, zastosujemy brutalną siłę i zwiększymy objętość, aby zwiększyć nasze szanse na sukces hodowlany. Ponieważ czasami musisz odwrócić uwagę od jedzenia i snu, a przesunięcia są ograniczone, prawdopodobnie wolisz, aby automatyzacja wybierała dziewczyny lub mężczyzn, którzy najlepiej odpowiadają Twoim gustom. Niskie rude lub wysokie brunetki – to zależy od Ciebie.

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 Automatyzacja Tindera. Zdjęcia z Tindera są zawsze publicznie dostępne, ale funkcja „lubię to” jest już ograniczona. Dlatego konieczne jest wyodrębnienie wszystkich żywych istot w promieniu i dokładne ich oznaczenie. Najpierw musisz użyć dość prostego skryptu:

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 powiązanie i wyodrębnij odpowiedź na żądanie POST w www.facebook.com/v2.6/dialog/oauth/confirm?dpr=1. Wewnątrz szukamy „access_token”. Z jakiegoś powodu nie zadziałało za pierwszym razem, ale potem znalazłem to i wpisałem na stałe w skrypcie.

Wymagania dotyczące zestawu danych

Istnieje kilka kluczowych wymagań dotyczących zbiorów danych uczenia maszynowego:

  1. Adekwatność
  2. Jednolitość
  3. 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ą Amazon Mechanical Turk, gdzie za opłatą możesz delegować znaczniki swojego zbioru danych innym osobom. Z drugiej strony, czy naprawdę chcesz, aby Twój bot lubił wspaniałe Azjatki o księżycowych twarzach, czy równie piękne dziewczyny o indyjskich korzeniach? Mimo to model powinien odzwierciedlać Twój gust.

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 Kaskady Haar. To doskonały algorytm, który pozwala znaleźć twarze na obrazach z niskim odsetkiem błędów fałszywie dodatnich.

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera
Bardziej szczegółowo opisano to w instrukcji OpenCV

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ą.

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera
źródło

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

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera

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 gotowy serwer wynajmowany. Nie będzie jeszcze możliwości trenowania, w tej chwili nie udostępniamy maszyn wirtualnych ze wsparciem CUDA do obliczeń, ale można coś uruchomić 24 godziny na dobę, 7 dni w tygodniu, bez żadnych problemów. Bot jest dość lekki, więc bardziej opłacalne byłoby przyjęcie taryfy, która płaci za wykorzystane zasoby.

wyniki

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera
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ć.

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera

Jak poderwać 13 dziewczyn na godzinę, korzystając z uczenia maszynowego i Tindera

Źródło: www.habr.com

Dodaj komentarz