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