Как обеспечить отображение class_indices в flow_from_dataframe - PullRequest
0 голосов
/ 25 сентября 2019

Я настраиваю генератор данных keras, используя flow_from_dataframe.Данные являются изображениями, и есть 2000 различных классов.У меня есть dataframe, который отображает файлы изображений на 2000 категорий (целые числа от 0 до 1999).Оба столбца (ссылки на изображения и метки) отформатированы как строки.

У меня есть сеть, которая была обучена кем-то другим с определенным отображением из class_indices в метки.Вот проблема: когда я настраиваю свой генератор данных с данными, с которыми я хочу протестировать обученную модель, он устанавливает буквенно-цифровой порядок на метках, который отличается от того, с которым работает обученная сеть.Теперь я понимаю, что «0» - это 0, «1» - это 1, но «100» - это 2, «1000» - это 3 и т. Д., Но я хочу, чтобы «2» - это 2, «3» - это 3 и т. Д.

Как следствие, обученная модель работает с точностью 0%.

Как обойти алфавитно-цифровое упорядочение в генераторе данных (например, «2» равно 2, «3» равно 3)?

Я использую керас 2.2.4.Я пробовал следующее (безуспешно):

  • преобразовать столбец в кадре данных pandas с метками в формат% 04d так, чтобы при алфавитно-цифровой сортировке он приводил в нужном порядке- однако это приводит к другому порядку («0000»: 0, «0001»: 1, «0007»: 2, «0008»: 3, «0011» ...)

  • предоставляет аргумент "классы" для построения генератора данных со списком в нужном порядке - однако этот порядок перезаписывается

  • предоставляет аргумент "классы"для построения генератора данных со словарем нужного отображения - однако, опять же, это перезаписывается и приводит к первоначальной проблеме (кажется, работает для «flow_from_directory»: Можно ли изменить индексы классаКерасы вытекают из каталога , но у меня это не работает с flow_from_dataframe)

То, что я пытаюсь, в основном выглядит так:

    my_generator = my_datagen.flow_from_dataframe(
        dataframe=my_df,
        target_size = (224,224),
        directory=None,
        x_col='filename',
        y_col='yID',
        class_mode='categorical',
        classes=classLabels,
        validate_filenames=False,
        batch_size=128)

гдеclassLabels может быть

classLabels = list(map(str,range(2000)))

или

classLabels = list(map(str,range(2000)))
classLabels = dict(zip(classLabels,list(range(2000))))

Ожидаемый результат заключается в том, что в my_generator.class_indices я получаю {'0': 0, '1': 1, '2': 2, '3': 3, ...}.Фактические результаты, например,

  • {'0000': 0, '0001': 1, '0007': 2, '0008': 3, '0011' ...} при преобразовании столбца данных в 4-значные цифры
  • {'0': 0, '1': 1, '100': 2, '1000': 3, '1002': 4, ...}, когда я даю или не предоставляю аргумент "классы" [как в качестве dictили список не имеет значения] при создании генератора

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

1 Ответ

0 голосов
/ 26 сентября 2019

На помощь пришел добрый и умный коллега.

То, что он дает странный порядок при преобразовании столбца метки в 4-разрядные строки, было связано с тем, что конкретный (тестирующий) фрейм данных имел не все 2000 классов, а только подмножество.

В принципе, 4-значное преобразование было правильным (если кому-то это нужно: my_df['yID'] = my_df['yID'].astype(str).str.zfill(4)).

Единственное, чего не хватало тогда, это дополнительно указать classLabels словарь, в котором строки также были представлены в 4-значном формате:

classLabels = list(map(lambda x: "{:04d}".format(x),range(2000)))
classLabels = dict(zip(classLabels,list(range(2000))))

Так что, в основном, я просто комбинировал то, что пытался,

Было бы здорово, если бы это было возможно непосредственно в keras, т. Е. Если бы у flow_from_dataframe была возможность отключить буквенно-цифровую сортировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...