#pandas #keras
#pandas #keras
Вопрос:
Я пытаюсь создать классификатор изображений с помощью keras, и размер моего набора данных требует, чтобы я использовал класс ImageDataGenerator вместе с его методом flow_from_dataframe. Это код, который я использую.
training = pd.read_csv("dataset/train/training.csv")
training = (training[(training["view_type"].isin(["view_4","view_5"]))])
training = (training[["id", "class"]]).reset_index(drop = True)
datagen = ImageDataGenerator(rescale = 1. /255)
training.head()
id class
0 image_view4_0.jpg lace_up
1 image_view4_1.jpg lace_up
2 image_view4_2.jpg zipper
3 image_view4_3.jpg lace_up
4 image_view4_4.jpg hookamp;look
train_generaor = datagen.flow_from_dataframe(dataframe = training,
directory = "dataset/train/images/",
xcol = "id",
ycol = "class",
has_ext = True,
class_mode = "categorical",
target_size = (224, 224))
Однако, когда я запускаю генератор поездов в colab, я получаю следующую ошибку
KeyError Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2524 try:
-> 2525 return self._engine.get_loc(key)
2526 except KeyError:
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 'filename'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
<ipython-input-39-e1787553cadc> in <module>()
7 target_size = (224, 224),
8 color_mode = "rgb",
----> 9 validate_filenames = True)
/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/image_data_generator.py in flow_from_dataframe(self, dataframe, directory, x_col, y_col, target_size, color_mode, classes, class_mode, batch_size, shuffle, seed, save_to_dir, save_prefix, save_format, subset, interpolation, drop_duplicates, **kwargs)
664 subset=subset,
665 interpolation=interpolation,
--> 666 drop_duplicates=drop_duplicates
667 )
668
/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/dataframe_iterator.py in __init__(self, dataframe, directory, image_data_generator, x_col, y_col, target_size, color_mode, classes, class_mode, batch_size, shuffle, seed, data_format, save_to_dir, save_prefix, save_format, subset, interpolation, dtype, drop_duplicates)
118 self.dtype = dtype
119 # check that inputs match the required class_mode
--> 120 self._check_params(df, x_col, y_col, classes)
121 if drop_duplicates:
122 df.drop_duplicates(x_col, inplace=True)
/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/dataframe_iterator.py in _check_params(self, df, x_col, y_col, classes)
162 .format(self.class_mode, self.allowed_class_modes))
163 # check that filenames/filepaths column values are all strings
--> 164 if not all(df[x_col].apply(lambda x: isinstance(x, str))):
165 raise ValueError('All values in column x_col={} must be strings.'
166 .format(x_col))
/usr/local/lib/python3.6/dist-packages/pandas/core/frame.py in __getitem__(self, key)
2137 return self._getitem_multilevel(key)
2138 else:
-> 2139 return self._getitem_column(key)
2140
2141 def _getitem_column(self, key):
/usr/local/lib/python3.6/dist-packages/pandas/core/frame.py in _getitem_column(self, key)
2144 # get column
2145 if self.columns.is_unique:
-> 2146 return self._get_item_cache(key)
2147
2148 # duplicate columns amp; possible reduce dimensionality
/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py in _get_item_cache(self, item)
1840 res = cache.get(item)
1841 if res is None:
-> 1842 values = self._data.get(item)
1843 res = self._box_item_values(item, values)
1844 cache[item] = res
/usr/local/lib/python3.6/dist-packages/pandas/core/internals.py in get(self, item, fastpath)
3841
3842 if not isna(item):
-> 3843 loc = self.items.get_loc(item)
3844 else:
3845 indexer = np.arange(len(self.items))[isna(self.items)]
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2525 return self._engine.get_loc(key)
2526 except KeyError:
-> 2527 return self._engine.get_loc(self._maybe_cast_indexer(key))
2528
2529 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 'filename'
Что происходит не так? Я перепробовал несколько способов исправить это, но не могу понять, почему это происходит
Комментарии:
1. Ошибка довольно очевидна, используемое вами имя файла неверно. Если ваши данные находятся в том же каталоге, что и рабочий каталог, используйте
'./dataset/train/images/'
2. Я использовал
./dataset/train/images/
и да, мои данные находятся в рабочем каталоге, но все равно я получаю ту же ошибку. Однако моя папка images содержит изображения, которых нет в столбце «id» моего фрейма данных, это не должно вызывать проблемы, но я новичок, поэтому просто делаю предположение.
Ответ №1:
Просто взглянув на документацию keras, ‘filename’ — это то, что он ожидает в аргументе xcol
. xcol
ссылается на столбец в dataframe, который, как предполагается, содержит путь к изображению относительно того, что вы указали в аргументе directory
.
Итак, вы просто предоставляете неправильные столбцы в качестве аргументов. Измените имена столбцов вашего фрейма данных из двух столбцов:
training.columns = ['path', 'class']
Затем измените свои аргументы на то, что требуется:
train_generaor = datagen.flow_from_dataframe(dataframe = training,
directory = "dataset/train/images/",
xcol = "path",
ycol = "class",
has_ext = True,
class_mode = "categorical",
target_size = (224, 224))
Комментарии:
1. Это должно устранить вашу ошибку ‘filename’, но вам также потребуется одноразово закодировать ваши категориальные метки в столбце ‘class’. Попробуйте это: scikit-learn.org/stable/modules/generated /…
2. Хорошо, я разобрался, это была глупая ошибка, это должно быть x_col, а не xcol. Спасибо за вашу помощь и быстрый ответ