Spaces:
Sleeping
Sleeping
| from torch.utils.data import Dataset | |
| import numpy as np | |
| import torch | |
| import lmdb | |
| import json | |
| from pathlib import Path | |
| from PIL import Image | |
| import os | |
| import datasets | |
| class TextDataset(Dataset): | |
| def __init__(self, prompt_path, extended_prompt_path=None): | |
| with open(prompt_path, encoding='utf-8') as f: | |
| self.prompt_list = [line.rstrip() for line in f] | |
| if extended_prompt_path is not None: | |
| with open(extended_prompt_path, encoding='utf-8') as f: | |
| self.extended_prompt_list = [line.rstrip() for line in f] | |
| assert len(self.extended_prompt_list) == len(self.prompt_list) | |
| else: | |
| self.extended_prompt_list = None | |
| def __len__(self): | |
| return len(self.prompt_list) | |
| def __getitem__(self, idx): | |
| batch = {'prompts': self.prompt_list[idx], 'idx': idx} | |
| if self.extended_prompt_list is not None: | |
| batch['extended_prompts'] = self.extended_prompt_list[idx] | |
| return batch | |
| class TwoTextDataset(Dataset): | |
| def __init__(self, prompt_path: str, switch_prompt_path: str): | |
| with open(prompt_path, encoding='utf-8') as f: | |
| self.prompt_list = [line.rstrip() for line in f] | |
| with open(switch_prompt_path, encoding='utf-8') as f: | |
| self.switch_prompt_list = [line.rstrip() for line in f] | |
| assert len(self.switch_prompt_list) == len(self.prompt_list), 'The two prompt files must contain the same number of lines so that each first-segment prompt is paired with exactly one second-segment prompt.' | |
| def __len__(self): | |
| return len(self.prompt_list) | |
| def __getitem__(self, idx): | |
| return {'prompts': self.prompt_list[idx], 'switch_prompts': self.switch_prompt_list[idx], 'idx': idx} | |
| class MultiTextDataset(Dataset): | |
| def __init__(self, prompt_path: str, field: str='prompts', cache_dir: str | None=None): | |
| self.ds = datasets.load_dataset('json', data_files=prompt_path, split='train', cache_dir=cache_dir, streaming=False) | |
| assert len(self.ds) > 0, 'JSONL is empty' | |
| assert field in self.ds.column_names, f"Missing field '{field}'" | |
| seg_len = len(self.ds[0][field]) | |
| for i, ex in enumerate(self.ds): | |
| val = ex[field] | |
| assert isinstance(val, list), f"Line {i} field '{field}' is not a list" | |
| assert len(val) == seg_len, f'Line {i} list length mismatch' | |
| self.field = field | |
| def __len__(self): | |
| return len(self.ds) | |
| def __getitem__(self, idx: int): | |
| return {'idx': idx, 'prompts_list': self.ds[idx][self.field]} | |
| def cycle(dl): | |
| while True: | |
| for data in dl: | |
| yield data | |