2017-01-19 3 views
5

Я хочу использовать методИспользование Keras ImageDataGenerator в регрессионной модели

ImageDataGenerator 

flow_from_directory 

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

flow_from_directory 

имеет параметр "class_mode" с Descripton

class_mode: один из "категориального", "двоичного", "разреженного" или None. По умолчанию: "категоричный". Определяет тип возвращаемых массивов меток: «категориальный» будет двумерным однострочным кодированным ярлыком, «двоичный» будет 1D бинарных ярлыков, «разреженный» будет 1D целых ярлыков.

Какое из этих значений следует брать? Ни один из них не кажется, очень подходит ...

+1

где это ценности хранятся? –

+1

Изначально существует папка с фотографиями и список, сопоставляющий фотографии с их целевыми значениями. Я открыт для предложений :-) К сожалению, документация по keras не сильно влияет на регрессионные модели. – user1934212

+1

На самом деле - вам нужно очень аккуратно, чтобы получить нужное вам поведение. –

ответ

4

На данный момент (новая версия Keras от 21 января 2017 года) flow_from_directory может работать только в следующим образом:

  1. Вы должны иметь каталоги структурирована следующим образом:

    directory with images\ 
        1st label\ 
         1st picture from 1st label 
         2nd picture from 1st label 
         3rd picture from 1st label 
         ... 
        2nd label\ 
         1st picture from 2nd label 
         2nd picture from 2nd label 
         3rd picture from 2nd label 
         ... 
        ... 
    
  2. flow_from_directory возвращает партии фиксированного размера в формате (picture, label).

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

  1. Вы должны структурировать каталог, в следующем порядке:

    directory with images\ 
        1st value (e.g. -0.95423)\ 
         1st picture from 1st value 
         2nd picture from 1st value 
         3rd picture from 1st value 
         ... 
        2nd value (e.g. - 0.9143242)\ 
         1st picture from 2nd value 
         2nd picture from 2nd value 
         3rd picture from 2nd value 
         ... 
        ... 
    
  2. Вы также должны иметь список list_of_values = [1st value, 2nd value, ...]. Тогда ваш генератор определяется в следующем порядке:

    def regression_flow_from_directory(flow_from_directory_gen, list_of_values): 
        for x, y in flow_from_directory_gen: 
         yield x, list_of_values[y] 
    

И это важно для flow_from_directory_gen иметь class_mode='sparse', чтобы сделать эту работу. Конечно, это немного громоздко, но он работает (я использовал это решение :))

+0

Спасибо. Очевидно, что flow_from_directory не предназначен для применения к задачам регрессии, поскольку целевые значения выводятся из структуры папок. Я подумаю об использовании вашего взлома - структура папок сначала выглядит сложной, но ее легко создать автоматически. – user1934212

1

Я думаю, что организация ваших данных по-другому, используя DataFrame (без необходимости перемещения ваших изображений в новые местоположения), позволит вам запустить регрессионная модель. Короче говоря, создайте столбцы в вашем DataFrame, содержащие путь к файлу каждого изображения и целевое значение. Это позволяет вашему генератору поддерживать правильную синхронизацию значений регрессии и изображений, даже если вы перетасовываете свои данные в каждую эпоху.

Ниже приведен пример, показывающий, как связать изображения с биномиальными целями, полиномиальными задачами и регрессионными целями, чтобы показать, что «цель является объектом является мишенью», и только модель может измениться:

df['path'] = df.object_id.apply(file_path_from_db_id) 
df 

     object_id bi multi         path  target 
index                
0   461756 dog white /path/to/imgs/756/61/blah_461756.png 0.166831 
1  1161756 cat black /path/to/imgs/756/61/blah_1161756.png 0.058793 
2  3303651 dog white /path/to/imgs/651/03/blah_3303651.png 0.582970 
3  3367756 dog grey /path/to/imgs/756/67/blah_3367756.png -0.421429 
4  3767756 dog grey /path/to/imgs/756/67/blah_3767756.png -0.706608 
5  5467756 cat black /path/to/imgs/756/67/blah_5467756.png -0.415115 
6  5561756 dog white /path/to/imgs/756/61/blah_5561756.png -0.631041 
7  31255756 cat grey /path/to/imgs/756/55/blah_31255756.png -0.148226 
8  35903651 cat black /path/to/imgs/651/03/blah_35903651.png -0.785671 
9  44603651 dog black /path/to/imgs/651/03/blah_44603651.png -0.538359 
10  49557622 cat black /path/to/imgs/622/57/blah_49557622.png -0.295279 
11  58164756 dog grey /path/to/imgs/756/64/blah_58164756.png 0.407096 
12  95403651 cat white /path/to/imgs/651/03/blah_95403651.png 0.790274 
13  95555756 dog grey /path/to/imgs/756/55/blah_95555756.png 0.060669 

Я описываю, как сделать это в деталях с примерами здесь:

https://techblog.appnexus.com/a-keras-multithreaded-dataframe-generator-for-millions-of-image-files-84d3027f6f43

 Смежные вопросы

  • Нет связанных вопросов^_^