Kaip nustatyti NSFW turinio aptikimą naudojant mašininį mokymąsi

Išmokyti mašiną atpažinti nepadorų turinį atgal nebuvo sunku, tačiau tikrai sunku buvo pirmą kartą.

Čia yra keletas išmoktų pamokų ir keletas patarimų, kuriuos atradau kurdamas NSFW modelį.

Nors yra daug būdų, kaip tai buvo galima įgyvendinti, šio pranešimo viltis yra pateikti draugišką pasakojimą, kad kiti suprastų, kaip gali atrodyti šis procesas.

Jei esate naujokas ML, tai įkvėps jus mokyti modelį. Jei jums tai būtų gerai žinoma, norėčiau išgirsti, kaip jūs būtumėte sukūrę šį modelį, ir paprašyti jūsų pasidalinti savo kodu.

Planas:

  1. Gaukite daug ir daug duomenų
  2. Pažymėkite ir išvalykite duomenis
  3. Naudokitės „Keras“ ir perkelkite mokymąsi
  4. Patikslinkite savo modelį

Gaukite daug ir daug duomenų

Laimei, NSFW duomenų rinkiniui buvo išleistas tikrai šaunus grandymo scenarijų rinkinys. Kodas yra paprastas, jau pateikiamas su etiketėmis pažymėtomis duomenų kategorijomis. Tai reiškia, kad tik sutikę su šio duomenų grandiklio numatytaisiais nustatymais, gausime 5 kategorijas, paimtas iš šimtų subreddits.

Instrukcijos yra gana paprastos, galite tiesiog paleisti 6 draugiškus scenarijus. Atkreipkite dėmesį į juos, nes galite nuspręsti pakeisti viską.

Jei turite daugiau subreddits, kuriuos norite pridėti, prieš atlikdami 1 veiksmą turėtumėte redaguoti šaltinio URL.

Pvz., Jei norėtumėte pridėti naują neutralių pavyzdžių šaltinį, pridėtumėte prie „subbreddit“ sąrašo nsfw_data_scraper/scripts/source_urls/neutral.txt.

„Reddit“ yra puikus turinio šaltinis visame žiniatinklyje, nes dauguma subredditų yra šiek tiek prižiūrimi žmonių, kad būtų tiksliniai to subbreddito tikslai.

Pažymėkite ir išvalykite duomenis

Duomenys, kuriuos gavome iš NSFW duomenų grandiklio, jau pažymėti etiketėmis! Tačiau tikėkitės klaidų. Juolab kad „Reddit“ nėra tobulai kuruojama.

Kopijavimas taip pat yra gana įprastas, tačiau taisomas be lėtos žmonių palyginimo.

Pirmas dalykas, kurį man patinka paleisti, yra tai, duplicate-file-finderkas yra greičiausia tiksli failų atitiktis ir ištrynimas. Jis maitinamas „Python“.

Qarj / duplicate-file-finder

Raskite pasikartojančius failus. Prisijunkite prie „Qarj / duplicate-file-finder“ kūrimo sukurdami paskyrą „GitHub“. github.com

Apskritai galiu gauti daugumą dublikatų, nukautų šia komanda.

python dff.py --path train/path --delete

Dabar tai neužfiksuoja „iš esmės“ vienodų vaizdų. Tam aš pasisakau už „Macpaw“ įrankio, vadinamo „Dvyniai 2“, naudojimą.

Nors tai atrodo labai paprasta, nepamirškite įsigilinti į automatinius dublikatus ir pasirinkite VISUS dublikatus, kol jūsų „Dvynių“ ekrane bus paskelbta „Nieko neliko“:

Galima sakyti, kad tai gali užtrukti labai daug laiko, jei turite didžiulį duomenų rinkinį. Asmeniškai aš jį paleidžiau kiekvienoje klasifikacijoje prieš paleisdamas jį į tėvų aplanką, kad išlaikyčiau pagrįstą veikimo laiką.

Naudokitės „Keras“ ir perkelkite mokymąsi

Aš pažvelgiau į „Tensorflow“, „Pytorch“ ir „raw Python“ kaip būdus sukurti mašininio mokymosi modelį nuo nulio. Bet aš nesiekiu atrasti kažko naujo, noriu efektyviai nuveikti tai, kas jau egzistavo. Taigi ėjau pragmatiškai.

Manau, kad „Keras“ yra praktiškiausia API paprastam modeliui parašyti. Net „Tensorflow“ sutinka ir šiuo metu stengiasi būti panašesnis į „Keras“. Be to, turėdamas tik vieną vaizdo plokštę, aš paimsiu populiarų jau esamą modelį + svorius ir paprasčiausiai treniruosiuosi ant jo, mokydamasis perkėlimo.

Po nedidelio tyrimo pasirinkau „Inception v3“, įvertintą imagenetu. Man tai lyg nueiti į jau esamą ML parduotuvę ir nusipirkti „Aston Martin“. Mes tiesiog nusiskusime viršutinį sluoksnį, kad galėtume naudoti tą modelį pagal savo poreikius.

conv_base = InceptionV3( weights="imagenet", include_top=False, input_shape=(height, width, num_channels) )

Kai modelis buvo vietoje, pridėjau dar 3 sluoksnius. 256 paslėptas neuronų sluoksnis, po kurio paslėptas 128 neuronų sluoksnis, po kurio eina paskutinis 5 neuronų sluoksnis. Pastaroji yra galutinė klasifikacija į penkias finalines klases, kurias moderuoja „softmax“.

# Add 256 x = Dense(256, activation="relu", kernel_initializer=initializers.he_normal(seed=None), kernel_regularizer=regularizers.l2(.0005))(x) x = Dropout(0.5)(x) # Add 128 x = Dense(128,activation='relu', kernel_initializer=initializers.he_normal(seed=None))(x) x = Dropout(0.25)(x) # Add 5 predictions = Dense(5, kernel_initializer="glorot_uniform", activation="softmax")(x)

Vizualiai šis kodas virsta tokiu:

Kai kurie iš aukščiau išvardytų dalykų gali atrodyti keistai. Juk ne kasdien sakai „glorot_uniform“. Nepaisant keistų žodžių, mano nauji paslėpti sluoksniai yra reguliuojami, kad būtų išvengta perpildymo.

Aš naudoju „dropout“, kuris atsitiktinai pašalins nervinius kelius, todėl modelyje nedominuoja nė viena savybė.

Be to, į pirmąjį sluoksnį taip pat įtraukiau L2 reguliavimą.

Dabar, kai modelis yra pagamintas, aš padidinau savo duomenų rinkinį tam tikru sukrėtimu. Aš pasukau, perstūmiau, apkarpiau, paslėpiau, priartinau, apversčiau ir kanalas pakeitė savo treniruočių vaizdus. Tai padeda užtikrinti, kad vaizdai būtų mokomi naudojant bendrą triukšmą.

Visos minėtos sistemos yra skirtos tam, kad būtų išvengta modelio perpildymo treniruočių duomenyse. Net jei tai yra daugybė duomenų, noriu, kad modelis būtų kuo labiau apibendrinamas naujiems duomenims.

After running this for a long time, I got around 87% accuracy on the model! That’s a pretty good version one! Let’s make it great.

Refine your model

Basic fine-tuning

Once the new layers are trained up, you can unlock some deeper layers in your Inception model for retraining. The following code unlocks everything after as of the layer conv2d_56.

set_trainable = False for layer in conv_base.layers: if layer.name == 'conv2d_56': set_trainable = True if set_trainable: layer.trainable = True else: layer.trainable = False

I ran the model for a long time with these newly unlocked layers, and once I added exponential decay (via a scheduled learning rate), the model converged on a 91% accuracy on my test data!

With 300,000 images, finding mistakes in the training data was impossible. But with a model with only 9% error, I could break down the errors by category, and then I could look at only around 5,400 images! Essentially, I could use the model to help me find misclassifications and clean the dataset!

Technically, this would find false negatives only. Doing nothing for bias on the false positives, but with something that detects NSFW content, I imagine recall is more important than precision.

The most important part of refining

Even if you have a lot of test data, it’s usually pulled from the same well. The best test is to make it easy for others to use and check your model. This works best in open source and simple demos. I released //nsfwjs.com which helped the community identify bias, and the community did just that!

The community got two interesting indicators of bias fairly quickly. The fun one was that Jeffrey Goldblum kept getting miscategorized, and the not-so-fun one was that the model was overly sensitive to females.

Once you start getting into hundreds of thousands of images, it’s hard for one person (like moi) to identify where an issue might be. Even if I looked through a thousand images in detail for bias, I wouldn’t have even scratched the surface of the dataset as a whole.

That’s why it’s important to speak up. Misclassifying Jeff Goldblum is an entertaining data point, but identifying, documenting, and filing a ticket with examples does something powerful and good. I was able to get to work on fixing the bias.

With new images, improved training, and better validation I was able to retrain the model over a few weeks and attain a much better outcome. The resulting model was far more accurate in the wild. Well, unless you laughed as hard as I did about the Jeff Goldblum issue.

Jei sugebėčiau pagaminti vieną trūkumą ... Aš pasilikčiau Jeffą. Bet deja, mes pasiekėme 93% tikslumą!

Apibendrinant

Tai galėjo užtrukti daug laiko, bet tai nebuvo sunku, ir buvo smagu sukurti modelį. Siūlau paimti šaltinio kodą ir išbandyti patiems! Tikriausiai net pabandysiu modelį perkvalifikuoti palyginimui su kitomis sistemomis.

Parodyk, ką turi. Prisidėti ar? Pažymėkite žvaigždute / žiūrėkite atpirkimą, jei norite pamatyti pažangą: https://github.com/GantMan/nsfw_model

Gantas Laborde yra „Infinite Red“ vyriausiasis technologijų strategas, paskelbtas autorius, docentas, pasaulinis viešasis pranešėjas ir pašėlęs mokslininkas. Ploti / sekti / „tweet“ arba aplankyti jį konferencijoje.

Ar turite minutę? Peržiūrėkite dar keletą:

Venkite košmarų - NSFW JS

Kliento nepadorus turinio tikrinimas sielai shift.infinite.red 5 dalykai, kurie čiulpia apie nuotolinį darbą

Nuotolinio darbo ir siūlomų sprendimų spąstai shift.infinite.red