在 PyTorch 中,加载数据通常使用 torch.utils.data.Dataset 和 torch.utils.data.DataLoader。下面从基础到常见用法给你讲清楚。
Dataset 类__init__:初始化__len__:数据总量__getitem__:按索引取一条数据import torch
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):
def __init__(self, data, labels):
self.data = data
self.labels = labels
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx], self.labels[idx]
# 示例数据
x = torch.randn(100, 10)
y = torch.randint(0, 2, (100,))
dataset = MyDataset(x, y)
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)
for batch_x, batch_y in dataloader:
print(batch_x.shape, batch_y.shape)
break
ImageFolder(最简单)目录结构:
data/
├── cat/
│ ├── 1.jpg
│ └── 2.jpg
├── dog/
│ ├── 1.jpg
│ └── 2.jpg
from torchvision import datasets, transforms
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor()
])
dataset = datasets.ImageFolder("data", transform=transform)
loader = DataLoader(dataset, batch_size=32, shuffle=True)
from PIL import Image
import os
class ImageDataset(Dataset):
def __init__(self, img_dir, transform=None):
self.img_dir = img_dir
self.img_list = os.listdir(img_dir)
self.transform = transform
def __len__(self):
return len(self.img_list)
def __getitem__(self, idx):
img_path = os.path.join(self.img_dir, self.img_list[idx])
image = Image.open(img_path).convert("RGB")
if self.transform:
image = self.transform(image)
return image
from torchvision import datasets
train_set = datasets.CIFAR10(
root="./data",
train=True,
download=True,
transform=transforms.ToTensor()
)
train_loader = DataLoader(train_set, batch_size=64, shuffle=True)
DataLoader(
dataset,
batch_size=32, # 每批大小
shuffle=True, # 是否打乱
num_workers=4, # 多线程加载
drop_last=False # 是否丢弃最后不满的batch
)
for epoch in range(epochs):
for x, y in dataloader:
x, y = x.to(device), y.to(device)
pred = model(x)
loss = criterion(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
如果你愿意,可以告诉我:
我可以直接给你对应的最优加载方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。