ComfyUI-Impact-Pack完整指南:5大核心功能助你轻松实现AI图像增强与修复
2026/5/13 5:34:05
@浙大疏锦行
核心目标:
涉及知识点:
datasets.MNIST,transforms.torch.utils.data.Dataset(实现__len__,__getitem__)。torch.utils.data.DataLoader(实现batch_size,num_workers)。场景类比:
场景描述:
原始图片是 0-255 的像素值(PIL Image 或 Numpy),但 PyTorch 模型只吃[0, 1] 之间的浮点 Tensor。
我们需要定义一个转换管道 (Transform Pipeline)。
任务:
transforms:转 Tensor + 归一化 (Normalize)。importtorchfromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasets,transformsimportmatplotlib.pyplotasplt# 1. 定义预处理管道# ToTensor: [0, 255] -> [0.0, 1.0] + 增加 Channel 维度 (1, 28, 28)# Normalize: (x - mean) / std。MNIST 的均值是 0.1307,标准差 0.3081transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])print("📥 正在下载/加载数据集...")# 2. 加载数据集 (Dataset)# root: 存放路径# train: True=训练集, False=测试集# download: 没有就自动下载train_dataset=datasets.MNIST(root='./data',train=True,download=True,transform=transform)test_dataset=datasets.MNIST(root='./data',train=False,download=True,transform=transform)print(f"✅ 训练集大小:{len(train_dataset)}")print(f"✅ 测试集大小:{len(test_dataset)}")📥 正在下载/加载数据集... 100%|██████████| 9.91M/9.91M [00:18<00:00, 535kB/s] 100%|██████████| 28.9k/28.9k [00:00<00:00, 167kB/s] 100%|██████████| 1.65M/1.65M [00:01<00:00, 1.52MB/s] 100%|██████████| 4.54k/4.54k [00:00<00:00, 1.73MB/s] ✅ 训练集大小: 60000 ✅ 测试集大小: 10000核心原理:train_dataset本质上是一个对象,它实现了两个魔术方法:
__len__: 告诉我一共多少道菜。__getitem__(index): 给我做第 index 道菜。任务:
train_dataset[0],看看拿出来的是什么。# --- 1. 像访问列表一样访问数据集 ---# 这会自动触发 __getitem__ 方法image,label=train_dataset[0]print(f"样本形状:{image.shape}")# (Channels, Height, Width) -> (1, 28, 28)print(f"样本标签:{label}")# 数字 5# --- 2. 可视化检查 ---defshow_img(img,lbl):# 反归一化 (为了显示正常,虽然不做也能看个大概)img=img*0.3081+0.1307# 转换维度: PyTorch (C, H, W) -> Matplotlib (H, W)# squeeze() 去掉维度为 1 的通道np_img=img.squeeze().numpy()plt.imshow(np_img,cmap='gray')plt.title(f"Label:{lbl}")plt.axis('off')plt.show()show_img(image,label)样本形状: torch.Size([1, 28, 28]) 样本标签: 5核心原理:
Dataset 只能一个一个拿数据。DataLoader 负责:
任务:
实例化train_loader和test_loader。
# 定义批次大小BATCH_SIZE=64# 1. 训练加载器 (需要打乱)train_loader=DataLoader(dataset=train_dataset,batch_size=BATCH_SIZE,shuffle=True,# 重点:训练时必须打乱num_workers=0# Windows 下建议设为 0 (主进程),Linux 可设为 4)# 2. 测试加载器 (不需要打乱)test_loader=DataLoader(dataset=test_dataset,batch_size=1000,# 测试时显存允许可以大一点shuffle=False)print(f"📦 Train Loader 共有{len(train_loader)}个 Batches")# 60000 / 64 ≈ 938📦 Train Loader 共有 938 个 Batches场景描述:
在真正的训练循环中,我们不需要手动getitem。
只需要写for data, target in train_loader:,DataLoader 就会源源不断地送数据出来。
任务:
从 DataLoader 中取出一个 Batch,查看其形状。
# 从 Loader 中获取第一个 Batch# iter() 转为迭代器,next() 取下一个data_batch,label_batch=next(iter(train_loader))print("=== 🎁 一个 Batch 的数据结构 ===")print(f"Data Batch Shape :{data_batch.shape}")# 预期: [64, 1, 28, 28] -> [Batch Size, Channel, Height, Width]print(f"Label Batch Shape:{label_batch.shape}")# 预期: [64]print("\n=== 🏷️ 这个 Batch 里的前 10 个标签 ===")print(label_batch[:10])# 可视化 Batch 里的第一张图show_img(data_batch[0],label_batch[0])=== 🎁 一个 Batch 的数据结构 === Data Batch Shape : torch.Size([64, 1, 28, 28]) Label Batch Shape: torch.Size([64]) === 🏷️ 这个 Batch 里的前 10 个标签 === tensor([0, 0, 2, 1, 9, 5, 0, 9, 1, 4])今天我们掌握了深度学习数据流的标准范式:
__len__和__getitem__。Dataset vs DataLoader 对照表:
| 特性 | Dataset | DataLoader |
|---|---|---|
| 关注点 | 单个样本 (Item) | 一批样本 (Batch) |
| 操作 | 读取文件、预处理 | 打包、打乱、多进程 |
| 角色 | 仓库管理员/厨师 | 物流车队/传菜员 |
Next Level:
有了数据加载器,明天(Day 39),我们终于可以构建一个真正的卷积神经网络 (CNN),来识别这些手写数字了!