company_banner

Как клеить по 13 девушек в час, используя машинное обучение и Tinder

    *Исключительно ради изучения Machine Learning, разумеется. Под немного недовольным взглядом любимой жены.

    Наверное, нет столь простого до уровня спинно-мозговых рефлексов приложений, как Tinder. Для того чтобы им пользоваться достаточно одного пальца, чтобы свайпать и немного нейронов, чтобы выбирать девушек или мужчин, которые тебе больше нравятся. Идеальная реализация брутфорса в выборе пары.

    Я решил, что это неплохой способ немного пощупать машинное обучение на новой видеокарте. Останется только объяснить жене, что мне не нужна новая женщина потолще, а я просто тренирую нейросети.


    В чем проблема сетей для знакомств


    Был такой ресурс — Ashley Madison. Специфичный, с лозунгом «Life is short. Have an affair». Основная аудитория — женатые мужчины, ищущие себе интрижку на стороне. Монетизация тоже веселая — помимо стандартных «потрать баллы, чтобы лайкнуть и написать» они просили $19, чтобы удалить аккаунт пользователя без следов.

    В 2015 году сайт закономерно протек и 60 ГБ персональных данных утекли в открытый доступ. Помимо множества разрушенных семей, эта утечка дала очень много интересной информации аналитикам. Я всегда подозревал, что мужчин на сайтах знакомств намного больше, но в этом случае оказалось совсем интересно. Журналистка Annalee Newitz, анализируя утекшие данные обнаружила, что из 5 миллионов пользователей только 12 000 были похожи на настоящие аккаунты девушек и использовались регулярно. Остальные были просто ботами, которые общались с мужчинами посетителями.

    Подобный перевес в сторону мужских аккаунтов характерен не только для этого ресурса, но и для большинства других сайтов знакомств. Уверен, что многие сталкивались с этой несомненно несправедливой ситуацией, когда тебе приходится старательно продумывать знакомство, а девушке достаточно просто зарегистрироваться. Качество этой толпы поклонников оставим в стороне, но факт несомненный, баланс спроса и предложения явно смещен в пользу девушек.

    Особенность Tinder


    image
    Идеальный брутфорсер в гендерных отношениях

    Основная особенность этой платформы именно в низких затратах на одно знакомство. Достаточно совпадения двух свайпов и вы уже общаетесь с потенциально интересным человеком. Проблема в том, что та же гендерная диспропорция приводит к тому, что у большинства девушек будут десятки совпадений в сутки. Это значит, что им скорее всего будет некогда обращать на вас внимание среди других кандидатов.

    Вполне понятно, что платформа подразумевает мало возможностей оценить глубокий внутренний мир человека по полуторасекундному взгляду на фотографию в купальнике или за рулем модного тонированного автомобиля. Поэтому, если вы не выглядите просто божественно на своих фотографиях, вам не остается ничего другого как увеличить свои шансы, переняв r‑стратегию у некоторых видов. Проще говоря, будем брутфорсить и брать объемом, чтобы увеличить свои шансы на размножение успех. Так как вам надо иногда отвлекаться на еду и сон, а свайпы ограничены, то вы наверняка предпочтете, чтобы автоматизация выбирала наиболее подходящие под ваши вкусы девушек или мужчин. Рыжих маленького роста или высоких брюнеток — это уже на ваше усмотрение.

    Собираем данные


    Прежде всего вам нужно очень много данных для нормальной точности. Любой, кто сталкивался с машинным обучением знает, как сложно бывает набрать корректно собранный и размеченный датасет. Теоретически, в качестве источника данных подойдет любой подобный ресурс, будь то Instagram или другие социальные сети. Но лучше всего обучать именно на тех образцах, на которых сеть будет работать в дальнейшем.

    За основу возьмем репозиторий TinderAutomation. Фотографии у Tinder всегда общедоступны, но функция «лайков» уже лимитирована. Поэтому надо извлечь все живое в радиусе и тщательно промаркировать. Для начала надо воспользоваться довольно простым скриптом:

    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. Тогда взлетит.
    Вторая проблема — добыть этот самый токен. Стандартный способ из репозитория у меня не взлетел, но получилось добыть его из консоли разработчика. Для этого переходим по ссылке и выдергиваем ответ на POST-запрос в www.facebook.com/v2.6/dialog/oauth/confirm?dpr=1. Внутри ищем 'access_token'. С первого раза почему-то не получилось, но потом я его нашел и захардкодил в скрипт.

    Требования к датасету


    Есть несколько ключевых требований к датасетам машинного обучения:

    1. Достаточность
    2. Равномерность
    3. Разнообразие

    Достаточность в данном случае требует не меньше 10000 фотографий для построения адекватной модели. Да, это очень много. Собственно поэтому и существуют сервисы вроде Amazon Mechanical Turk, где за определенную плату вы можете перепоручить разметку вашего датасета другим людям. С другой стороны, вы точно хотите, чтобы ваш бот лайкал чудесных луноликих азиаток или не менее прекрасных девушек с индийскими корнями? Все-таки модель должна отражать именно ваш вкус.

    С разнообразием проблем особо нет, все фотографии представлены в разнообразных ракурсах и освещении. В очках, платьях, купальниках и лыжных костюмах. Проблема может возникнуть с равномерностью датасета. В идеале, когда мы разметим нашу выборку, она должны состоять из приблизительно равных частей. Если у вас получился «перекошенный» датасет, то его придется разбавлять фотографиями из других источников. Более симпатичных надо будет добавить или наоборот вы определите по результату разметки. У меня получилось что-то в районе 60% симпатичных. То ли я не слишком разборчив, то ли мне просто повезло и вокруг много симпатичных девушек.

    Я также не отметаю гипотезу, что среди них много ботов. Обучаем бота, который будет лайкать других ботов. В этом есть некая ирония.

    Обработка данных


    У нас есть куча размеченных фотографий, но они очень разношерстные. Дневные, ночные, со спины и прочие. С сожалением понимаю, что обучать на фотографиях с обратного ракурса особо не получится, так как выборка будет сильно неравномерная. Поэтому, оптимальным вариантом будет использование лиц, как опорного признака «симпатичности». Все-таки для нас, как и для других приматов, это ключевой параметр.

    Поэтому воспользуемся каскадами Хаара. Это отличный алгоритм, который позволяет находить лица на изображениях с низким процентом ложноположительных ошибок.

    image
    Более подробно это описано в мануале к OpenCV

    На следующем этапе, после того, как в выборке окажутся только лица, имеет смысл убрать цвет. На самом деле, вам вряд ли придется выбирать между прекрасно-голубой обитательницей Пандоры или зеленокожей красавицей.


    Источник

    У людей 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'])
    

    Если есть хорошая выборка, то ее вполне может оказаться достаточно для получения пригодной для работы модели.

    Запускаем бота


    image

    Спасибо автору репозитория за готовый вариант для быстрой проверки идеи. На самом деле вполне себе работает в базовом варианте и можно, в принципе, запустить на нашем готовом арендованном сервере. Обучать пока не получится, на данный момент мы не предоставляем виртуальные машины с поддержкой CUDA для расчетов, но запустить что-то на 24/7 работу можно без проблем. Бот довольно легковесный, поэтому выгоднее будет взять тариф с оплатой за использованные ресурсы.

    Результаты



    Наверное я очень симпатичный. И у меня богатый внутренний мир. Получил что-то в районе 13 совпадений в течение часа. Причем, несколько раз девушки писали первыми.
    В итоге получались весьма милые диалоги, где я рассказывал, что зашел исключительно поиграть с машинным обучением и разметкой данных. Одна из девушек крайне заинтересовалась, так как сама разработчик. Есть стойкое ощущение, что она в итоге прочитает этот пост на Хабре. Я очень надеюсь, что Оксана сохранит мою анонимность. :-)
    *машет лапой и передает привет

    Немного про этическую сторону вопроса


    Честно говоря, мне вообще не нравится сама идея роботизации отношений между мужчинами и девушками. Есть что-то очень правильное в том, чтобы накинуть свою куртку на плечи к замерзшей незнакомой девушке, которая стоит в одиночестве. Или подойти к симпатичной девушке в летнем кафе и вместе выпить кофе. Вылезайте уже из-за мониторов.

    Вокруг лето. Пора знакомиться.



    RUVDS.com
    RUVDS – хостинг VDS/VPS серверов

    Комментарии 127

      +36
      Вспоминается…
      За последние 25 лет во фразе «Мальчик в клубе склеил модель» изменилось значение всех четырех слов.
      куда потом девать столько склеенных девушек? )
      Но часть про автоматизацию — классная.
        +10
        Я думаю, слово «модель» для многих из нас, разработчиков, тоже поменяло своё значение.
          +9
          В этом случае слово «модель» поменяло свое значение дважды )
            +21

            поговорка 15 лет назад была по 1 и 2, а сейчас скорее про 2 и 3.


            [подросток] в [школьном клубе] [склеил] [модель самолёта/корабля].
            [парень] в [танцевальном клубе] [познакомился] c [привлекательной манекенщицей]
            [мужчина неопределённого возраста] в [компьютерном клубе по интересам] [создал/напечатал] [3D-модель]
            бонус:
            [аспирант] на [кафедре] [сформулировал] [мат. модель]

            0

            В какой-то мере нет. Та модель, которая в MVC и ко в какой-то мере тоже ненастоящий аналог чего-то настоящего, как и те модели, которые клеилив детстве.

            0
            С мальчиком-то что случилось?
              +1

              Он немного подрос. Лет так минимум на 5-6

                +9
                А как же бессмертное «Типичный мальчик. Кто скажет, что это девочка, пусть первый бросит в меня камень!» (с) Ильф&Петров?
                0
                Повзрослел
                  +1
                  И модели игрушки стали дороже.
                  +2
                  В оригинале Пионер, а с ним случилось многое)
                +51
                Есть что-то очень правильное в том, чтобы накинуть свою куртку на плечи к замерзшей незнакомой девушке, которая стоит в одиночестве

                Однако, они начинают кричать в среднем через 6.37 секунды после этого.

                  +7

                  Это если совсем маньячно подкрадываться)

                    0
                    некоторые просто очень мягко ходят
                    я вроде дома хожу в резиновых тапочках, но у меня все родственники говорят, что я вечно подкрадываюсь, хотя просто хожу)
                      +5

                      У меня жена тоже подпрыгивает постоянно) пора вешать пищалку как на автопогрузчике)

                        +2
                        Во-во, только я до пищалки не дошел, единственное что пришло в голову — бить ложкой по кастрюле, перемещаясь по квартире.
                          0
                          Хожу очень тихо, но быстро. В качестве профилактики внезапного обнаружения мня гражданами в досадной близости от себя принимаюсь предупредительно пошаркивать на дистанции метра в три-четыре;), особенно при обгонах. Очень это снижает нервность в окружающей среде;).
                          0
                          о! стартапно )))
                      +6

                      Так надо же иногда куртку постирать!

                        +32
                        Однако, они начинают кричать в среднем через 6.37 секунды после этого.
                        Меня пугает то, какое количество экспериментов вам было необходимо провести, чтобы вычислить это число с достаточным доверительным интервалом для двух знаков после запятой.
                          +11
                          Скорее всего их пугает как раз таки тот второй человек с таймером и его пристальный внимательный взгляд.
                          0
                          Да ладно!)
                          Неужели все так изменилось?
                            0
                            Поэтому надо не забывать и про тряпку с хлороформом.
                            +3
                            Пока не особо понял профиты. Достаточно премиальной подписки и ограничения по лайкам тоже не будет (а для айтишника её стоимость достаточно мала). К тому же слишком избирательное лайканье нарушает ранее озвученные принципы брутфорса (автор сначала сам говорит, что существует проблема, что для большого количества матчей «нужно иметь модельную внешность», а потом сам же создаёт систему, которая будет лайкать только девушек с идеальной для него внешностью).

                            Конечно, ИИ чат-бот оптимизированный под максимально качественное раскрытие сильных сторон парня и максимально быстро вытаскивание на свидание, скорее всего пока за гранью возможностей технологий, да и имеет некоторые проблемы (на свидании вскроется, что манера речи реального человека совсем не совпадает с ботом). Но ожидал от статьи всё равно чего-то другого. Например, применение методик А/B тестирования и т. д. для оптимизации профиля парня (фото и описания) для максимизации обратных лайков.
                              +1
                              на свидании вскроется, что манера речи реального человека совсем не совпадает с ботом
                              напомнило истории про письма сидельцев из тюрем по газетным объявлениям о знакомствах, где сиделец просто переписывал тексты любовных писем из пачки шаблонов, подставляя только имена. И в итоге на встречу к даме приходил не ожидаемая утонченная натура, а полуграмотный урка, который двух слов связать не может.
                                0
                                Емнип, Тиндер при масслайкинге вводит какие-то пессимизации.
                                  0
                                  у тиндера есть некий «ладдер», со своим внутренним ELO и elo-hell соответственно. Говорят, elo основывается на некоем соотношении «количество полученных свайпов к количеству разданных свайпов», т.е. если свайпать всех подряд, твой фейс будут реже показывать в тех местах, где людей много.
                                    +9
                                    на свидании вскроется, что манера речи реального человека совсем не совпадает с ботом

                                    «Я разочарована! В чате ты так умилительно пытался провалить тест Тьюринга, а на свидании разговариваешь как обыкновенный кожаный мешок!»

                                    +7

                                    Сейчас на сайтах знакомств тоже полно ботов, в т.ч. в Тиндер. Недавно прочитал пару статей (с пруфами и ссылками), что набирают людей вести десятки аккаунтов девушек на Mamba и Badoo.


                                    Про Тиндер пока такого не читал, но вспоминая свой опыт (уже давно снёс приложение), есть ощущение, что ботов там тоже очень много. Однозначно есть молчащие боты, которые появляются, например, когда ты находишься где-нибудь в заштатной уральской деревеньке, а тебе выпадает несколько подряд: «Jenny», «Eve» и т.п. модельной вшешности. Правда меня они не лайкали (кажется, уже не помню точно), но уверен, что есть и менее очевидные боты.


                                    Скоро дойдёт до того, что с обеих сторон останутся лишь боты, которые будут лайкать друг-друга, и вести разговоры. Кто знает, возможно так появится Skynet. :)

                                      0
                                      Скоро дойдёт до того, что с обеих сторон останутся лишь боты, которые будут лайкать друг-друга, и вести разговоры. Кто знает, возможно так появится Skynet. :)


                                      Я думаю, что и сейчас оптимизированная Алиса неплохо справится с задачей присутствия «людей» в Тандыре.
                                        0
                                        Скоро дойдёт до того, что с обеих сторон останутся лишь боты, которые будут лайкать друг-друга, и вести разговоры.
                                        Ну это видимо со всякой соцсетью случается на каком-то этапе, с ЖЖ это произошло еще десять лет назад, во времена «монетизации», когда каждый вася с десятком подписчиков начал делать рекламные посты. Но с «монетизацией-то» понятно, а какой профит можно получить в Тиндере — вот это загадка.
                                          0
                                          Точно так же можно кидать «поклонникам» в диалог рекламу — обычно интим-услуг, учитывая аудиторию, хотя одна жж-юзер недавно писала, как нашла в тиндре объявление сантехника.
                                            0

                                            Никакой загадки. Разводят на бабло и покупки ради встречи

                                              0
                                              По-моему, боты ещё не настолько круты.
                                              0

                                              Профит, например, в том что потом придет сообщение с предложением увеличить что-то, или о том что это оказывается не просто Jenny, а наследница африканского короля… Ну или просто уже готова приехать, только денег бы на дорогу… желательно биткоинами… ХЗ что ещё там ждать, но просмотров у таких сообщений точно выше, чем у писем, которые спамфильтры уже вычищают без проблем)

                                              0
                                              А потом они начнут встречаться.
                                                0
                                                Сейчас на сайтах знакомств тоже полно ботов, в т.ч. в Тиндер. Недавно прочитал пару статей (с пруфами и ссылками), что набирают людей вести десятки аккаунтов девушек на Mamba и Badoo.

                                                Может боты и не так плохо, если они скорректируют поток желающих пообщаться с девушкой, но вот общаться с мужиком прикидывающимся девушкой, да и вообще любым человеком, прикидывающимся тем кем не является, на сайте знакомств общаться не хотелось бы.

                                                  0

                                                  А что плохого в том, чтобы найти в Тиндере собутыльника?

                                                    0
                                                    Выглядит как идея для стартапа.
                                                      0

                                                      Пффф. Зайди на avito. Там уже куча предложений от опытных девушек-собутыльниц с высшим филологическим. От 300 рублей в час по Skype)

                                                  +3
                                                  Шутки-шутками — но изрядное количество лет назад бот ALICE, подключенный нами ради прикола к популярному в одной восточной стране мессенджеру — довольно быстро стал там одним из самым популярных пользователей.
                                                  А когда, уже в другой компании, мы в рекламных целях создали аккаунт молодой девушки — причем «фото» ее было явно нарисованным — Фейсбук забанил «за фейковость»… личный аккаунт чувака который писал за нее.
                                                    +1
                                                    Роберт Шекли «Мой двойник–робот».
                                                    +2
                                                    Очень интересный способ популяризировать пайтон. Класс. :) Спасибо за контент!
                                                      +28
                                                      Всегда испытывал раздражение от таких конструкций:
                                                      if ans == "1":
                                                          save_image(image, photo, True)
                                                      else:
                                                          save_image(image, photo, False)


                                                      Почему бы не просто
                                                      save_image(image, photo, ans == "1")

                                                      ?
                                                        +7
                                                        «Детские ошибки», каждый программист через такое проходит)
                                                          +2
                                                          Имхо для новичка его код более понятен.
                                                            –7
                                                            Первый вариант намного лучше читается. Сам булевский параметр абсолютно неинформативен — что за True-False — надо смотреть сигнатуру. В будущем это может быть заменено, например, на перечисление с нормальным говорящим именем, и здесь будут нужны две строки, разве что из извращения кто-то использует тернарный оператор «посмотри как я могу». Или же может быть добавлен комментарий, поясняющий смысл булевского параметра.
                                                              +1
                                                              Первый вариант намного лучше читается.

                                                              Спорно. Уж что такое булевское выражение, должно быть понятно любому, даже самому начинающему, программисту. Код с условным оператором, во-первых, просто более громоздок (что в исходнике, что после компиляции), а во-вторых, он провоцирует к ошибкам при дальнейшей разработке. Внести изменение в одной ветке (например, заменить процедуру save_image на какой-нибудь новый save_image2) и забыть сделать аналогичное изменение во второй — самое милое дело.

                                                              Сам булевский параметр абсолютно неинформативен — что за True-False — надо смотреть сигнатуру.

                                                              Её в любом случае надо смотреть, если если есть желание узнать, как эта процедура работает и что в неё надо передавать.

                                                              В будущем это может быть заменено, например, на перечисление с нормальным говорящим именем

                                                              Будет заменено — тогда и будет тема для разговора.

                                                              разве что из извращения кто-то использует тернарный оператор «посмотри как я могу»

                                                              Тернарный оператор — это извращение? :-) Вот замыкания функций в JS — это, я понимаю, извращение, а тернарный оператор — удобная конструкция, позволяющая во многих случаях писать красивые компактные выражения без дополнительных строчек кода, промежуточных переменных, условных операторов и дублирующихся вызовов функций. Альтернативный вариант, кстати — отображение типов через массив констант. Популярно там, где нет тернарных операторов — Delphi, PowerShell (до 7-й версии).
                                                                0
                                                                Код с условным оператором, во-первых, просто более громоздок (что в исходнике, что после компиляции)

                                                                Хоба!
                                                                  0
                                                                  Главное, оптимизацию не выключать.
                                                                    +1

                                                                    А зачем её выключать?

                                                                      0
                                                                      Так я и предлагаю её не вылкючать. Хотя я как-то встречался с такой ситуацией, что выключение оптимизации помогало обойти ошибку в компиляторе Swift.
                                                                    0
                                                                    Уговорили, оптимизация может это решить.
                                                                      +1

                                                                      Для одинакового кода -O1 уже достаточно.

                                                                      +2
                                                                      Спорно. Уж что такое булевское выражение, должно быть понятно любому, даже самому начинающему, программисту

                                                                      Разумеется, но я говорил о читаемости. Это субъективный фактор: для вас лучше упаковать логику в одну строку, и при необходимости, растянуть ее по горизонтали, а мне удобнее читать код «в два этажа». Ошибка с неизменением ветки возможна теоретически — я согласен, но это случается чаще всего когда ветвление громоздко и не влазит в экран. Это явно не тот случай + замена, скорее всего, будет производиться либо рефакторингом в IDE, либо через множественный курсор, либо через Search&Replace->All.

                                                                      Код с условным оператором, во-первых, просто более громоздок

                                                                      У меня такое ощущение, что мы с вами стоим возле пакетной вычислительной машины, табуляторов году так в 1970, вертим в руках колоду перфокарт, и вы мне доказываете, что с «ветвлением» уйдет на три перфокарты больше, чем с однострочником, и это, мол, недостаток. И та, и та конструкция — самодостаточны и умещаются в экран, т.е. укладываются в область единомоментного внимания человека.

                                                                      Её в любом случае надо смотреть, если если есть желание узнать, как эта процедура работает и что в неё надо передавать.

                                                                      Не-а. Допустим, мы просто смотрим код, и хотим понять, что он делает.
                                                                      Видим строку:
                                                                      save_image(image, photo, True)

                                                                      По коду мы видим, что image — это имя картинки в коллекции (директории и т.д.), photo — бинарное тело самой картинки. А что такое «True»? А хз, надо идти смотреть сигнатуру метода. Допустим, третий параметр называется «bool overwriteIfExists» — т.е. он контролирует перезапись, скажем, картинок с одинаковым названием. Нам надо знать не только за что отвечает параметр, но и помнить, что true — это вот оверврайт, а false — это проигнорировать и дописать в конец. А может, не дописать, а вернуть ошибку? А хз, надо уже смотреть логику.
                                                                      Теперь представьте, что код у нас выглядит как
                                                                      if ans == "1":
                                                                          save_image(image, photo, overwriteIfExists)
                                                                      else:
                                                                          save_image(image, photo, ignoreIfExists)

                                                                      И мы знаем, что делают обе ветки. True и False в данном случае — это, считай, те же magic number'ы.

                                                                      Ну да, но если значение этой промежуточной переменной не нужно где-то дальше, то её можно выкинуть, сделав код чуть короче.

                                                                      А зачем? См. выше про перфокарты.
                                                                      Будет заменено — тогда и будет тема для разговора.

                                                                      А это очевидный шаг, который можно сделать сразу, это даже overengineer'ингом не будет. Зато будет читаться.
                                                                      Другой вариант — задефайнить overwriteIfExists TRUE, но… зачем, если можно сделать перечисление.

                                                                      Тернарный оператор — это извращение? :-) Вот замыкания функций в JS — это, я понимаю, извращение, а тернарный оператор — удобная конструкция, позволяющая во многих случаях писать красивые компактные выражения без дополнительных строчек кода,

                                                                      Не вообще извращение, в некоторых контекстах. В том-то и дело, что так удобно писать. А вот понимать чужой код, записанный однострочником… мне лично — говорю за себя — намного сложнее.
                                                                      По части дубляжа — tyomitch уже привел snippet'ы.
                                                                      Альтернативный вариант, кстати — отображение типов через массив констант. Популярно там, где нет тернарных операторов — Delphi,

                                                                      Это то же самое, вид сбоку. Маппирование одной области определения на другую.
                                                                        0
                                                                        True и False в данном случае — это, считай, те же magic number'ы.

                                                                        Классная формулировка!

                                                                    +8

                                                                    someFlag = ans == "1"
                                                                    save_image(image, photo, someFlag)

                                                                      0
                                                                      Ну да, но если значение этой промежуточной переменной не нужно где-то дальше, то её можно выкинуть, сделав код чуть короче.
                                                                        +2
                                                                        У дополнительной переменной есть неоспоримый плюс — у неё есть имя. Взглянув на код сразу понятно, что этот параметр означает. А если её выбросить — придётся лезть в определение функции, чтобы понять какой там она третий параметр принимает.
                                                                          0
                                                                          А если её выбросить — придётся лезть в определение функции, чтобы понять какой там она третий параметр принимает.

                                                                          Это только в устаревших ЯП.

                                                                          А в Swift, к примеру, будет так:
                                                                          saveImage(image: image, photo: photo, someFlag: ans == "1")
                                                                          
                                                                            0
                                                                            Сахарок. И он принципиально ближе к варианту с доп.переменной, чем к однострочнику.
                                                                              +1
                                                                              Ну как сахарок, это часть имени процедуры.

                                                                              Это разные процедуры:
                                                                              saveImage(image: image, photo: photo, someFlag: ans == "1")
                                                                              

                                                                              saveImage(image: image, photo: photo, otherFlag: ans == "1")
                                                                              
                                                                                0
                                                                                Я имею в виду, что этот сахарок (ну или не сахарок) придумали как-раз для совмещения плюсов однострочника и варианта с доп.переменными. Чтобы не спорить, что лучше.
                                                                    +1
                                                                    А не проще ли лайкать всех подряд, а тех кто лайкнет в ответ уже просмотреть глазами и отфильтровать встроенной в голову нейросетью?
                                                                      +1

                                                                      Проблема в том, что ограничено количество лайков за период времени, соответственно, если лайкать всех подряд, то половина лайков уйдёт на заведомо неподходящие варианты.

                                                                        0
                                                                        Скорее всего в сервисе есть ограничение на число лайков в час — как раз против самых простых скриптов.
                                                                          0
                                                                          Проще, но практика показывает, что в любом приложении эта стратегия не даёт вообще ничего. Даже если лайкать всех подряд не глядя, совпадений всё равно нет.
                                                                            0
                                                                            Пользуюсь этой практикой давно. Всегда отсеивал только откровенно неприятные лица. Обратный отклик зависит напрямую от качества собственного фото и описания.
                                                                              0
                                                                              В каждой подобной теме обязательно найдётся товарищ, желающий рассказать всем, как они рылом и умом не вышли, а у него с качественными фотками и детальным описанием всё хорошо. Рад за вас, что у вас всё хорошо.

                                                                              Моя практика показывает, что ни фото, ни описание, ни лайки подряд, ни лайки не подряд, ни випы, ни какие-либо другие фичи в последние несколько лет не работают вообще никак. Я уверен, что сломана сама система, а именно крайне не ровное соотношение полов и искажение восприятия вследствии такого перекоса. Извините, но когда люди на простое человеческое приветствие начинают закатывать истерику или банить, а витиеватые персонализированные заходы игнорить (т.к. у них 100500 приветов и пиписек во входящих, плюс заоблачные ожидания и иллюзия бесконечного выбора) — в себе проблему искать сложновато.
                                                                                +2
                                                                                Я не говорил, что проблема в вас. И даже не намекал. Я свое фото вообще ни разу за 2 года не ставил, т.к. считаю, что лицом не вышел.
                                                                                Ваша практика показывает, что брутфорс не работает. Моя практика показывает, что он работает. А логика подсказывает, что брутфорс поможет собрать максимальное количество заинтересованных.
                                                                                Что касается перекоса, простите, но знакомства всегда были «cосисочным пати».
                                                                                  0
                                                                                  А логика подсказывает, что брутфорс поможет собрать максимальное количество заинтересованных.

                                                                                  в нескольких комментах выше пишут про пессимизацию брутфорсеров, так что логика вполне может подсказывать и обратное.
                                                                              +1
                                                                              Что до масслайкинга, что после, количество мэтчей примерно одинаковое. Наблюдение из своего опыта.
                                                                            +23
                                                                            Вылезайте уже из-за мониторов.

                                                                            Легко вам, социальным, говорить. Не могу представить, что должно произойти, чтобы я осилил к кому-то подойти.

                                                                              0

                                                                              Можно же в интернетике брутфорсить девушек. Только взять ещё diаlogflow нормально настроенный

                                                                                +4

                                                                                Фиг его знает. Я со своей бывшей познакомился на мамбе, когда она ещё хоть относительно была живая. И ничего. Встречались довольно долго.


                                                                                Но я поддержу автора. В реальности как-то более лампово.

                                                                                  +36
                                                                                  хочется верить, что она в данном предложении — это мамба, а не бывшая
                                                                                    0

                                                                                    "Которая мамба", живая), но конкуренцию "Ленинградке" составить не может. Не там копают.

                                                                                    +1
                                                                                    Фиг его знает. Я со своей бывшей познакомился на мамбе, когда она ещё хоть относительно была живая. И ничего. Встречались довольно долго.

                                                                                    На мамбе у меня был простой лайфхак — писать только тем, которые зарегистрированы совсем недавно, не более недели назад. И хватало бесплатного лимита новых диалогов в сутки чтоб получать достаточно много ответов, каждую неделю встречаться вживую с кем-то, так что я быстро нашёл нужный вариант и недолго там просидел. Был очень удобный инструмент в умелых руках, в общем-то.
                                                                                      0

                                                                                      Когда я там был, там не было лимита)

                                                                                      +1

                                                                                      Я тоже с женой на Мамбе познакомился (женаты 9 лет)

                                                                                        0

                                                                                        Ощущаю себя динозавром. Я с женой познакомился в FIDO… и, да, фидо тоже сломалось.

                                                                                        +1
                                                                                        Дедфуд, асоциальный вы наш, подойдите уже к жене.
                                                                                          +2

                                                                                          К чьей?

                                                                                            +3
                                                                                            К собственной.

                                                                                            Это вы просто с манерой поведения Дедфуда не знакомы. На «Хабре» он любит жаловаться, что его не любят женщины, что у него плохо с математикой и работой. На деле он женат, у него хорошая и интересная работа, защищена кандидатская.

                                                                                            Не, ну я не против, этот косплей даже забавно выглядел. Первые лет пять. Сейчас это уже шутка, которая повторяется в тристапятидесятый раз. Чуточку осточертело.
                                                                                              +1

                                                                                              Ты б ещё про уточек Шестивольтового вспомнил и прочие офигительные истории, там и то больше реализма.


                                                                                              Банально даже от кандидатской у меня остался только сданный кандмин, а работы уже полгода как нет (и работу с ежедневным онколлом и SLA в минуту я не могу назвать хорошей, хоть там и было интересно). Это даже как-то не смешно.

                                                                                                +5
                                                                                                А жена-то, жена есть?
                                                                                                  0

                                                                                                  Тут ближе всего к истине. Была когда-то.


                                                                                                  Хотя, впрочем, хорошая и интересная работа тоже была когда-то, да и сейчас наклёвывается.

                                                                                                    +1
                                                                                                    Значит, асоциальность не помешала?
                                                                                                      0

                                                                                                      Я не знаю, как ответить на этот вопрос, угодив при этом своим представлениям об этике.

                                                                                        +6
                                                                                        Вот бы еще показали как в Тиндер такие фильтры добавить :-)

                                                                                        image
                                                                                          0
                                                                                          И ещё чтоб жениться не требовала :)
                                                                                            0
                                                                                            Насчёт UI для фильтра наличия детей: обычно если опция выключается, а текст не меняется, то и фильтр выключается, совсем. То есть будут показаны и с прицепом, и без :)
                                                                                            if trailerSwitch.isOn
                                                                                            {
                                                                                                filters.append("kidsCount > 0") // или filters.append("hasChildren == true")
                                                                                            }
                                                                                            

                                                                                            А вы наверное имеете в виду это:
                                                                                            if trailerSwitch.isOn
                                                                                            {
                                                                                                filters.append("kidsCount > 0")
                                                                                            }
                                                                                            else
                                                                                            {
                                                                                                filters.append("kidsCount == 0")
                                                                                            }
                                                                                            

                                                                                              0
                                                                                              С анимированными картинками
                                                                                                 /|       |\
                                                                                              `__\\       //__'
                                                                                                 ||      ||
                                                                                               \__`\     |'__/
                                                                                                 `_\\   //_'
                                                                                                 _.,:---;,._
                                                                                                 \_:     :_/
                                                                                                   |@. .@|
                                                                                                   |     |
                                                                                                   ,\.-./ \
                                                                                                   ;;`-'   `---__________-----.-.
                                                                                                   ;;;                         \_\
                                                                                                   ';;;                         |
                                                                                                    ;    |                      ;
                                                                                                     \   \     \        |      /
                                                                                                      \_, \    /        \     |\
                                                                                                        |';|  |,,,,,,,,/ \    \ \_
                                                                                                        |  |  |           \   /   |
                                                                                                        \  \  |           |  / \  |
                                                                                                         | || |           | |   | |
                                                                                                         | || |           | |   | |
                                                                                                         | || |           | |   | |
                                                                                                         |_||_|           |_|   |_|
                                                                                                        /_//_/           /_/   /_/
                                                                                              
                                                                                                   by Valkyrie
                                                                                              0
                                                                                              Либо я что-то не понял, либо у Вас точность 72% при event rate 60% на бинарной классификации. Это же совсем недалеко от рандомной модели.
                                                                                                0
                                                                                                можно бустить
                                                                                                +1
                                                                                                Не совсем понятно, что решает ваша нейросеть. У тиндера совй алгоритм ранжирования. Он и так вам подбирает девушек которые больше всего вам подходят. Понятно, что для обучения ему нужно время и по началу он будет показывать всех подряд.
                                                                                                  +25
                                                                                                  Вокруг лето. Пора знакомиться.
                                                                                                  image
                                                                                                    0
                                                                                                    Как-то летом во время выезда компанией на природу идём по тропинке куда-то с приятелем и обсуждаем нюансы работы в Турбо Дебаггере (это ещё 90-е, да). Впереди идёт девушка из другой компании. Через пару минут она поворачивается к нам: «Ребята, вы на природе. Лето, лес, речка… Забудьте про Турбо Дебаггер!»
                                                                                                    +2
                                                                                                    Если цель стоит поиграться с машинным обучением то идея ок. Если цель получить по-больше совпадений — тупо покупаешь платную подписку. Во-первых, раз в месяц можно поднимать анкету наверх (сразу летит несколько десятков лайков). Во-вторых, есть возможность посмотреть кто лайкнул, поэтому просто выбираешь подходящие варианты. Итого, за день можно получить до 10 совпадений. По мере опускания анкеты вниз, количество лайков и соответственно совпадений, конечно, стремительно уменьшается.

                                                                                                    Другое дело что:
                                                                                                    1. Непонятно сколько там ботов
                                                                                                    2. Каждая 5-я девушка тупо собирают подписчиков в свой инстаграм. Подозреваю что девушки этим даже не занимаются, просто пользуются сервисами которые продвигают инстаграм любыми методами включая сайты знакомств — уж очень анкеты однотипные.
                                                                                                      +2
                                                                                                      Оксана нашлась?
                                                                                                        +5
                                                                                                        Так и без машинного обучения можно
                                                                                                          +3

                                                                                                          Я с твоего позволения продублирую)
                                                                                                            0
                                                                                                            Нельзя, там есть ограничение на количество лайков в день. Поэтому нужно лайкать выборочно а не все подряд.
                                                                                                            0
                                                                                                            Сразу хочу сказать, что без хорошей видеокарты и CUDA вы скорее всего просто не получите обученную модель в адекватные сроки. Поэтому сразу нацеливайтесь на расчеты в специализированных облаках или с использованием python-CUDA.
                                                                                                            А можно хотя бы приблизительно написать на какой карте и сколько времени заняло обучение?
                                                                                                            И не очень понял, сколько именно было размеченных фото в обучающей выборке?
                                                                                                              0

                                                                                                              Если добавить gpt + reinforcement learning для диалогов то останется андроида вместо себя на свидания отправлятт. Ещё вспоминается чат-бот который разводил в какой-то соцсетке девушек на фотки :-).

                                                                                                                +9
                                                                                                                Не удержался)))
                                                                                                                image
                                                                                                                  +1
                                                                                                                  Я один ожидал, что под катом будет крутой Natural Language Processing, скрешенный с пикап-техниками? Или это планируется в следующей версии бота?)
                                                                                                                    0

                                                                                                                    Научить бы нейросеть определять ботов и фейки вот было бы в разы полезнее. У ботов например обычно фото со спины, мб какие то другие есть маркеры в описании, именах и т.п.

                                                                                                                      0
                                                                                                                      Здесь фотки со спины как минимум будут отсеяны каскадом Хаара.
                                                                                                                      +6
                                                                                                                      Удивлён, что никто не написал ни слова про качество реализации идеи, про сами нейросеточки. Скажем так, на троечку, может даже с минусом.

                                                                                                                      Для начала, десять тысяч примеров — это в старые добрые времена так было, сейчас уже с одним экземпляром на класс сети учатся (после нефигового претрейна, конечно же), а с 10-100 — вообще есть результаты в пределах погрешности от полностью supervised (см. BYOL, SimCLR(v2), MoCo(v2)).

                                                                                                                      Дальше, трехслойный велосипед и 72% точности — это близко к случайному шуму вообще, а все игры с поиском лиц и перегоном в черно-белый — в лучшем случае бесполезны. Если просто взять предобученную сеточку пожирнее (хотя тут и самый легкий mobilenet зайдёт для начала) и пофайнтюнить на три класса «нравится», «не нравится» и «мусор» (без лица, левые предметы и т.д.), то будет качество за 90% сходу и без лишних операций.
                                                                                                                        0
                                                                                                                        Расскажешь подробнее? Интересно.
                                                                                                                          0
                                                                                                                          Про какую из частей? Про semi/self-supervised/few-shot learning или про бест практики базовой классификации? Про первое могу только на лидерборд ссылку дать, а оттуда уже читать статьи, прям готового саммари нет: paperswithcode.com/sota/self-supervised-image-classification-on. А про второе — это прямо первый урок, классическая задача «как в 10 строк отличать кошечек от собачек» course.fast.ai/videos/?lesson=1
                                                                                                                            0
                                                                                                                            Крайне признателен)
                                                                                                                              0
                                                                                                                              Где видюхи взять для тренировки рассказать? :)
                                                                                                                                0
                                                                                                                                Да, кидай) я думаю, что не только мне пригодится.
                                                                                                                                  +1
                                                                                                                                  Там в принципе во введении в fast.ai всё описано, но совсем бесплатных варианта по сути 2: гугл колаб (12 часов рантайм) и кернелы на кагле (30 часов в неделю)
                                                                                                                                    0
                                                                                                                                    Спасибо)
                                                                                                                                      0

                                                                                                                                      Спасибо за информацию, сложновато правда пока. Пока смотрю основы :)

                                                                                                                                0

                                                                                                                                Про self-supervision недавно Дьяконов писал.

                                                                                                                                  +1
                                                                                                                                  Неплохо, да. Правда уже аж на месяц устарело, как-то за последние пару недель понавыходило статей на тему, видимо туда усилия народные пошли, теперь будет каждую неделю сота улучшаться :)
                                                                                                                            +2

                                                                                                                            Привет, я Оксана...

                                                                                                                              +2
                                                                                                                              Хором:
                                                                                                                              — Привет, Оксана!
                                                                                                                                +1
                                                                                                                                — Оксана, мы все уронили… совсем все!
                                                                                                                                +2
                                                                                                                                Склеил модель, чтобы она клеила моделей ¯\_(ツ)_/¯
                                                                                                                                  –1
                                                                                                                                  >>вы точно хотите, чтобы ваш бот лайкал чудесных луноликих азиаток или не менее прекрасных девушек с индийскими корнями?
                                                                                                                                  Какая разница кого трахать ?) Это же не поиск жены. Большинству без разницы кого и где.
                                                                                                                                    –3
                                                                                                                                    а как сделать так, чтоб подобные статьи уровня «как протрахаться подешевле» не видеть в своей ленте?
                                                                                                                                      0
                                                                                                                                      Вы читали дальше заголовка?

                                                                                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                                                    Самое читаемое