Использование Keras ImageDataGenerator в регрессионной модели

Я хочу использовать

flow_from_directory

метод

ImageDataGenerator

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

flow_from_directory

имеет параметр "class_mode" с описание

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

какое из этих значений я должен взять? Ни один из них не подходит...

2 ответов


на данный момент (новейшая версия 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' чтобы сделать эту работу. Из конечно, это немного громоздко, но это работает (я использовал это решение :))


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

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

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