Использование 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
может работать только следующим образом:
-
вам нужно иметь каталоги, структурированные следующим образом:
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 ... ...
-
flow_from_directory
возвращает пакеты фиксированного размера в формате(picture, label)
.
таким образом, как вы можете видеть, он может использоваться только для случая классификации, и все параметры, приведенные в документации, указывают только способ который класс предоставляется Вашему классификатору. Но, есть аккуратный хак, который может сделать flow_from_directory
полезно для задачи регрессии:
-
нужно структурировать свой каталог следующим образом:
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 ... ...
-
Вам также нужно иметь список
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
я описываю, как это сделать, очень подробно и с примерами здесь: