Как да настроите NSFW за откриване на съдържание с машинно обучение

Преподаването на машина да разпознава неприлично съдържание не беше трудно в ретроспекция, но със сигурност беше трудно за първи път.

Ето някои научени уроци и някои съвети и трикове, които открих, докато изграждах модел на NSFW.

Въпреки че има много начини това да бъде приложено, надеждата на тази публикация е да предостави приятелски разказ, така че другите да могат да разберат как може да изглежда този процес.

Ако сте нов в ML, това ще ви вдъхнови да обучите модел. Ако сте запознати с него, бих се радвал да чуя как бихте започнали да изграждате този модел и да ви помоля да споделите кода си.

Планът:

  1. Вземете много и много данни
  2. Обозначете и почистете данните
  3. Използвайте Keras и прехвърлете обучението
  4. Прецизирайте вашия модел

Вземете много и много данни

За щастие беше пуснат наистина страхотен набор от изстъргващи скриптове за набор от данни на NSFW. Кодът е прост, вече се предлага с етикетирани категории данни. Това означава, че само приемането на настройките по подразбиране на този скрепер за данни ще ни даде 5 категории, изтеглени от стотици подредакти.

Инструкциите са доста прости, можете просто да стартирате 6 приятелски скрипта. Обърнете им внимание, тъй като може да решите да промените нещата.

Ако имате повече подредакции, които искате да добавите, трябва да редактирате изходните URL адреси, преди да изпълните стъпка 1.

Например - Ако трябва да добавите нов източник на неутрални примери, бихте добавили към списъка с подредактиране в nsfw_data_scraper/scripts/source_urls/neutral.txt.

Reddit е чудесен ресурс за съдържание в мрежата, тъй като повечето субреддити са леко контролирани от хората, за да бъдат насочени към този субреддит.

Обозначете и почистете данните

Данните, които получихме от скрепера за данни NSFW, вече са етикетирани! Но очаквайте някои грешки. Особено след като Reddit не е идеално подготвен.

Дублирането също е доста често срещано, но поправимо без бавно човешко сравнение.

Първото нещо, което обичам да стартирам, е duplicate-file-finderкое е най-бързото точно съвпадение и изтриване на файлове. Той се захранва в Python.

Qarj / търсач на дублирани файлове

Намерете дублиращи се файлове. Допринесете за разработването на Qarj / duplicate-file-finder, като създадете акаунт в GitHub. github.com

Обикновено мога да получа по-голямата част от дубликатите, унищожени с тази команда.

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

Сега това не улавя изображения, които по същество са еднакви. За това препоръчвам използването на инструмент Macpaw, наречен „Близнаци 2“.

Макар това да изглежда супер просто, не забравяйте да разровите автоматичните дубликати и изберете ВСИЧКИ дубликати, докато екранът ви Gemini декларира „Нищо не остава“ по този начин:

Може да се каже, че това може да отнеме изключително много време, ако имате огромен набор от данни. Лично аз го стартирах за всяка класификация, преди да го пусна в родителската папка, за да запазя разумно време на изпълнение.

Използвайте Keras и прехвърлете обучението

Разгледах Tensorflow, Pytorch и raw Python като начини за изграждане на модел за машинно обучение от нулата. Но не търся да открия нещо ново, искам ефективно да направя нещо, което вече съществува. Затова отидох прагматичен.

Открих, че Keras е най-практичният API за писане на прост модел. Дори Tensorflow се съгласява и в момента работи за подобряване на Keras. Освен това, само с една графична карта, ще грабна популярен вече съществуващ модел + тежести и просто ще тренирам върху него с известно обучение за трансфер.

След малко проучване избрах Inception v3, претеглена с imagenet. За мен това е като да отида до вече съществуващия магазин за ML и да купя Aston Martin. Ние просто ще обръснем най-горния слой, за да можем да използваме този модел според нашите нужди.

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

С модела на място добавих още 3 слоя. 256 скрит невронен слой, последван от скрит 128 невронен слой, последван от последния 5 невронен слой. Последното е крайното класиране в петте финални класа, модерирани от 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)

Визуално този код се превръща в следното:

Някои от горните може да изглеждат странни. В крайна сметка не всеки ден казвате „glorot_uniform“. Но настрана странни думи, новите ми скрити слоеве се уреждат, за да се предотврати пренастройването.

Използвам отпадане, което случайно ще премахне невронни пътища, така че никой елемент да не доминира в модела.

Освен това добавих L2 регуларизация и към първия слой.

Сега, когато моделът е свършен, аз увеличих набора от данни с генерирана агитация. Въртях, премествах, изрязвах, отрязвах, мащабирах, обръщах и каналите премествах тренировъчните си изображения. Това помага да се гарантира, че изображенията се обучават чрез общ шум.

Всички горепосочени системи имат за цел да предотвратят пренастройването на модела върху данните за обучение. Дори ако става дума за тон данни, искам да запазя модела възможно най-обобщаващ за нови данни.

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.

Ако можех да произведа един недостатък ... щях да запазя Джеф. Но уви, постигнахме 93% точност!

В обобщение

Може да отне много време, но не беше трудно и беше забавно да се изгради модел. Предлагам ви да вземете изходния код и да го изпробвате сами! Вероятно дори ще се опитам да преквалифицирам модела с други рамки за сравнение.

Покажи ми какво имаш. Принос или? Създайте звезда / гледайте репото, ако искате да видите напредъка: https://github.com/GantMan/nsfw_model

Гант Лаборд е главен технологичен стратег в Infinite Red, публикуван автор, адюнкт-професор, световен публичен говорител и луд учен в обучение. Пляскайте / следвайте / чуруликайте или го посетете на конференция.

Имате ли минута? Вижте още няколко:

Избягвайте кошмарите - NSFW JS

Client-side indecent content checking for the soulshift.infinite.red5 Things that Suck about Remote Work

The Pitfalls of Remote Work + Proposed Solutionsshift.infinite.red