Спрете да използвате flow_from_directory и вместо това използвайте flow_from_dataframe.

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

В тази статия ще се съсредоточа върху набори от данни, които са съставени от изображения, особено тези за проблеми с класификацията на изображения. Ще видим как стартирането на обучения на Keras върху този вид набори от данни има някои предимства при използване на рамки от данни на Pandas.

Keras предоставя начин за използване на големи набори от данни при работа с невронни мрежи: или в етапа на обучение, или в етапа на оценка. Това е модулът за предварителна обработка на Keras, който има няколко метода за зареждане на данни от диска и динамичната им предварителна обработка. Най-често срещаният метод е flow_from_directory(), което е много прост работен процес, тъй като просто трябва да разделите вашите файлове с изображения в папки за всеки клас. Генераторът ще приеме всяка папка като класове, които ще бъдат обучавани. Това е доста просто, да, но включва разработването на отнемащи време скриптове за копиране или преместване на изображения от една страна на друга за всяка версия на набор от данни за обучение.

  • Но какво ще стане, ако решите да направите някои модификации за конкретен експеримент, като например разделяне на един клас на два? — Версиониране на набор от данни
  • Какво става, ако искате да съставите набор от данни с изображения, които идват от два или повече набора от данни? — Комбинация от множество набори от данни
  • Какво ще стане, ако искате да обучите два етикета едновременно, защото вашият мрежов модел има два изхода? — Проблеми с много задачи

Ще видим как използването на библиотеката Pandas ще помогне за облекчаване на тези проблеми.

Keras има функция за генериране, която е предназначена да използва рамка от данни на Pandas за зареждане на данни от диск: flow_from_dataframe(). Тази рамка с данни трябва да има колона, в която да посочите името на файла на изображението за всеки елемент. С това и параметъра directory, Keras ще състави пътя за всеки файл с изображение по следния начин:os.path.join(directory, <filename_column>)
В този момент можете да забравите идеята файловете да са организирани в папки на класове и вместо това можете просто да ги имате всички в същата папка.

Всеки от следващите раздели се опитва да отговори на един от трите предишни въпроса, като използва тозиflow_from_dataframe() метод.

Версиониране на набор от данни

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

Това води до наличието на различни версии на набор от данни, които са по-ясно представени от кадри с данни, вместо да се налага да създавате отделна папка, в която изображенията се копират с нова класова структура. Най-силното в това е, че файловете с голям размер (изображенията) все още са в същата директория. Следователно можете да имате няколко версии на набор от данни (csv файлове), съставени от различни комбинации от едни и същи изображения.

Комбинация от множество набори от данни

Както споменах преди, Keras композира пътя на изображенията, които да бъдат прочетени, като използва параметъра directory и колоната за име на файл. Последният трябва да има името на файла, но може да съдържа и подпътеки. Keras ще извърши присъединяването, без да пита дали има само име на файл. Това е много мощно за набори от данни, които изтегляте онлайн и имат определена структура, в която изображенията се намират в различни поддиректории. Освен това с това можем лесно да съставим версия на набор от данни, където има изображения, които идват от различни източници, без да се налага да ги преместваме в една и съща папка.

Да видим пример:

Да предположим, че имате набор от данни 1 и набор от данни 2 със следните пътища на изображения:

/media/datasets/dataset_1/train/image_1.png
/media/datasets/dataset_1/train/image_2.png
/media/datasets/dataset_2/train/0289323/image_1.png
/media/datasets/dataset_2/train/3453453/image_1.png

Набор от данни 1 има структура, в която всички изображения са в една и съща директория: dataset_1/train/*. Въпреки това, набор от данни 2 е различен, той има подпапки и самото име на файла на изображението се повтаря („image_1.png“), така че трябва да добавим тази подпапка към колоната за име на файл. Това биха били двата кадъра с данни и съответните им извиквания на метод Keras:

За да създадем обединена версия (набор от данни 3), трябва само да добавим пътя, откъдето двата пътя стават различни: „dataset_1/” и „dataset_2/”.

За този пример трябва да зададем параметъра на директорията в flow_from_dataframe() на общия път, за да може Keras да съставя пътища, които работят и за двата набора от данни.

Едно нещо, което предлагам тук, е да създадете папка, например dataset_3, със символни връзки към двата набора от данни:

~/datasets $ mkdir dataset_3
~/datasets $ cd dataset_3
~/datasets/dataset_3 $ ln -s ~/datasets/dataset_1/train dataset_1
~/datasets/dataset_3 $ ln -s ~/datasets/dataset_2/train dataset_2
~/datasets/dataset_3 $ ls -l
dataset_1 -> /home/sruiz/datasets/dataset_1/train
dataset_2 -> /home/sruiz/datasets/dataset_2/train

Това е само за целите на организацията, тъй като основният път, където двата набора от данни се различават, би бил: /home/datasets/dataset_3 вместо по-общия: /home/datasets. Но , също може да бъде много полезно, ако наборите от данни се намират на различни места и не споделят никакъв основен път — и не искате да ги местите.

Многозадачни проблеми

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

За този вид проблеми се нуждаем от два етикета за всеки вход в стъпката на обучение. Така че подходът за разделяне на файловете в папки за всеки етикет, въпреки че „е възможно“, включва наличието на една папка за всяка комбинация от етикети. Нещо, което може да доведе до създаване на голям брой папки.

Хубавото на рамката с данни е, че можете да имате колона за етикет котка/куче и друга за цвета на кожата. Когато използвате метода flow_from_dataframe() с вашата мрежа с два изхода, трябва само да посочите в параметъра y_col в кои колони са етикетите:

Благодаря за четенето.

Серхио Руис (@serchu)