Преобразование словаря в наборы данных.arrow_dataset.Dataset
Я пытаюсь использовать блокнот тонкой настройки Pokemon , в котором используется набор данных Pokemon BLIP captions ; см. GitHub из репозитория примеров Lambda Labs ; обучающий код находится в кодовой базе justinpinkney/stable-diffusion . Я хочу точно настроить Stable Diffusion для набора данных об обложках альбомов MuMu .
У меня есть (N, 512, 512, 3) массив изображений и (N) список строк подписи. Исходная кодовая база работает с объектом <class 'datasets.arrow_dataset.Dataset'>, поэтому я пытаюсь преобразовать свой набор данных в этот формат, используя datasets.Dataset.from_dict() внутри hf_dataset() в ldm/data/simple.py:
img_dict = {}
for i in range(len(img_tensor)):
img_dict[i] = { 'image': img_tensor[i], 'text': img_captions[i] }
from datasets.Dataset import from_dict
ds = from_dict(img_dict)
Это приводит к огромной трассировке ошибок, заканчивающейся на:
File "pyarrow/error.pxi", line 100, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: arrays to be concatenated must be identically typed, but list<item: list<item: uint8>> and string were encountered.
Я думаю, проблема в том, что img_tensor[i] — это 2D-массив (список списков записей uint8), а img_captions[i] — это строка. Как я могу преобразовать свои данные в объект datasets.arrow_dataset.Dataset?
1 ответ
Решил это, недостаточно внимательно читал документацию. У меня есть словарь целочисленных ключей со значениями словаря, но мне нужно «отображение строк в массивы или списки Python» в соответствии с документацией . Вот пример игрушки:
img_tensor = np.zeros((100, 512, 512, 3))
captions = []
for i in range(100):
captions.append('hello')
captioned_imgs = {
'images': img_tensor,
'text': captions
}
from datasets import Dataset
out = Dataset.from_dict(captioned_imgs)
print(type(out))
Вывод: <класс 'datasets.arrow_dataset.Dataset'>