*Semplicemente per motivi di apprendimento del Machine Learning, ovviamente. Sotto lo sguardo un po' insoddisfatto della sua amata moglie.
Probabilmente non esiste un'applicazione così semplice a livello dei riflessi spinali come Tinder. Per usarlo ti basta un dito per scorrere e qualche neurone per scegliere le ragazze o gli uomini che ti piacciono di più. Un'implementazione ideale della forza bruta nella selezione della coppia.
Ho deciso che questo sarebbe stato un buon modo per avere un'idea dell'apprendimento automatico su una nuova scheda grafica. Non resta che spiegare a mia moglie che non ho bisogno di una nuova donna più grassa e sto solo allenando le reti neurali.
Qual è il problema con le reti di incontri?
C'era una tale risorsa: Ashley Madison. Specifico, con lo slogan “La vita è breve. Avere una relazione." Il pubblico principale è costituito da uomini sposati che cercano una relazione secondaria. Anche la monetizzazione è divertente: oltre allo standard "spendere punti per mettere mi piace e scrivere", hanno chiesto 19 dollari per eliminare l'account di un utente senza lasciare traccia.
Nel 2015, naturalmente, il sito è trapelato e 60 GB di dati personali sono diventati di pubblico dominio. Oltre a molte famiglie distrutte, questa fuga di notizie ha fornito agli analisti molte informazioni interessanti. Ho sempre sospettato che ci fossero molti più uomini sui siti di incontri, ma in questo caso la cosa si è rivelata piuttosto interessante. La giornalista Annalee Newitz
Una tale preponderanza verso gli account maschili è tipica non solo di questa risorsa, ma anche della maggior parte degli altri siti di incontri. Sono sicuro che molti si sono imbattuti in questa situazione indubbiamente ingiusta, quando devi pianificare attentamente una conoscenza, ma la ragazza deve solo registrarsi. Lasciamo da parte la qualità di questa folla di fan, ma è innegabile il fatto che l’equilibrio tra domanda e offerta sia nettamente spostato a favore delle ragazze.
Funzionalità esca
Il brute forcer ideale nelle relazioni di genere
La caratteristica principale di questa piattaforma è il basso costo per conoscenza. Basta una coincidenza di due passaggi e stai già comunicando con una persona potenzialmente interessante. Il problema è che lo stesso squilibrio di genere porta al fatto che la maggior parte delle ragazze avrà dozzine di partite al giorno. Ciò significa che molto probabilmente non avranno tempo per prestarti attenzione tra gli altri candidati.
È abbastanza chiaro che la piattaforma implica poche opportunità di valutare il profondo mondo interiore di una persona da uno sguardo di un secondo e mezzo a una foto in costume da bagno o alla guida di un'auto colorata alla moda. Pertanto, se non sembri semplicemente divino nelle tue fotografie, non hai altra scelta che aumentare le tue possibilità adottando
Raccolta dati
Prima di tutto, sono necessari molti dati per una precisione normale. Chiunque abbia avuto a che fare con il machine learning sa quanto possa essere difficile produrre un set di dati correttamente raccolto ed etichettato. In teoria, qualsiasi risorsa simile sarà adatta come fonte di dati, sia essa Instagram o altri social network. Ma è meglio formarsi su quei campioni su cui la rete lavorerà in futuro.
Prendiamo come base il repository
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)
Ti consentirà di contrassegnare il set di dati il più rapidamente possibile con solo due pulsanti. La trappola principale sta nel fatto che la libreria werkzeug ha rotto la compatibilità con le versioni precedenti e dovrà essere costretto a eseguirne il downgrade. Altrimenti genera questo errore.
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'
Pertanto nel file require.txt è necessario scrivere Werkzeug==0.16.1. Poi decollerà.
Il secondo problema è ottenere proprio questo token. Il metodo standard del repository non ha funzionato per me, ma sono riuscito a ottenerlo dalla console degli sviluppatori. Per fare questo, vai a
Requisiti del set di dati
Esistono diversi requisiti chiave per i set di dati di machine learning:
- Adeguatezza
- Uniformità
- Diversità
La sufficienza in questo caso richiede almeno 10000 fotografie per costruire un modello adeguato. Sì, è molto. Questo è in realtà il motivo per cui i servizi piacciono
Non ci sono particolari problemi di varietà; tutte le fotografie sono presentate da diverse angolazioni e illuminazioni. Negli occhiali, nei vestiti, nei costumi da bagno e nelle tute da sci. Potrebbe sorgere un problema con l’uniformità del set di dati. Idealmente, quando etichettiamo il nostro campione, dovrebbe essere composto da parti approssimativamente uguali. Se ti ritroverai con un set di dati “distorto”, dovrai diluirlo con fotografie provenienti da altre fonti. Dovrai aggiungerne di più attraenti o viceversa, li determinerai in base al risultato del markup. Ho qualcosa di carino intorno al 60%. O non sono troppo esigente, oppure sono semplicemente fortunato e ci sono un sacco di belle ragazze in giro.
Inoltre non scarto l’ipotesi che tra loro ci siano molti bot. Addestriamo un bot che piacerà ad altri bot. C'è una certa ironia in questo.
Elaborazione dati
Abbiamo un sacco di foto taggate, ma sono molto contrastanti. Di giorno, di notte, da dietro e altri. Con rammarico, capisco che insegnare dalle fotografie da un angolo inverso non sarà particolarmente efficace, poiché il campione sarà molto irregolare. Pertanto, l’opzione migliore sarebbe quella di utilizzare i volti come segno di riferimento di “carineria”. Eppure per noi, come per gli altri primati, questo è un parametro fondamentale.
Pertanto, usiamo
Questo è descritto più dettagliatamente nel manuale
Nella fase successiva, quando nel campione sono presenti solo i volti, è opportuno rimuovere il colore. In effetti, difficilmente dovrai scegliere tra il bellissimo abitante blu di Pandora o la bellezza dalla pelle verde.
Nelle persone Hue, il colore della pelle non fornisce un contributo significativo alle valutazioni di attrattiva.
Pertanto, vale la pena semplificare il lavoro della rete neurale e lasciare solo la scala di grigi.
Costruzione di modelli
Voglio dire subito che senza una buona scheda video e CUDA, molto probabilmente semplicemente non otterrai un modello addestrato in tempo adeguato. Pertanto, punta immediatamente ai calcoli in cloud specializzati o utilizzando python-CUDA.
Ho preso un esempio base a tre livelli dall'autore del repository e, sorprendentemente, ha mostrato una precisione di circa il 72%, che è un risultato abbastanza buono.
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'])
Se esiste un buon campione, potrebbe essere sufficiente per ottenere un modello realizzabile.
Lanciamo il bot
Grazie all'autore del repository per un'opzione già pronta per testare rapidamente l'idea. In effetti, funziona abbastanza bene nella versione base e, in linea di principio, può essere lanciato sulla nostra
Giudizio
Immagino di essere molto carino. E ho un mondo interiore ricco. Ho ottenuto qualcosa come 13 partite in un'ora. Inoltre, più volte le ragazze hanno scritto per prime.
Di conseguenza, ci siamo ritrovati con dialoghi molto carini, in cui ho detto che ero venuto esclusivamente per giocare con l'apprendimento automatico e l'etichettatura dei dati. Una delle ragazze era estremamente interessata, dato che lei stessa è una sviluppatrice. C'è la forte sensazione che prima o poi leggerà questo post su Habré. Spero davvero che Oksana mantenga il mio anonimato. 🙂
*agita la zampa e saluta
Un po 'sul lato etico della questione
Ad essere sincero, non mi piace l’idea di robotizzare le relazioni tra uomini e ragazze. C'è qualcosa di molto giusto nel gettare la giacca sulle spalle di un estraneo infreddolito che sta in piedi da solo. Oppure avvicinati a una bella ragazza in un bar estivo e bevi un caffè insieme. Esci già da dietro i monitor.
L'estate è ovunque. È tempo di fare conoscenza.
Fonte: habr.com