Преобразование словаря в наборы данных.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'>

Другие вопросы по тегам