# DAY 38 Dataset 和 Dataloader 类知识点回顾:
1. Dataset 类的__getitem__和__len__方法(本质是 python 的特殊方法)
2. Dataloader 类
3. minist 手写数据集的了解
作业:了解下 cifar 数据集,尝试获取其中一张图片
# 1. 导入必要库 import torch from torchvision import datasets, transforms import matplotlib.pyplot as plt import numpy as np # 2. 固定随机种子(可选,保证结果一致) torch.manual_seed(42) # 3. 定义数据预处理(CIFAR-10专用均值/标准差) # 说明:CIFAR-10的全局均值和标准差是行业公认值,标准化用 transform = transforms.Compose([ transforms.ToTensor(), # 转Tensor:把0-255的PIL图片→0-1的Tensor,维度[C, H, W](3,32,32) transforms.Normalize( mean=[0.4914, 0.4822, 0.4465], # R/G/B三通道均值 std=[0.2470, 0.2435, 0.2616] # R/G/B三通道标准差 ) ]) # 4. 加载CIFAR-10数据集(自动下载) # 训练集 train_dataset = datasets.CIFAR10( root='./data', # 数据集保存路径 train=True, # 加载训练集(False则加载测试集) download=True, # 本地没有则自动下载 transform=transform # 应用预处理 ) # 5. 关键:提取单张图片并可视化 # 5.1 取数据集第0个样本(特征Tensor + 标签) img_tensor, label_idx = train_dataset[0] # img_tensor.shape = [3,32,32],label_idx是0-9的整数 print(f"图片Tensor形状:{img_tensor.shape}") # 输出:torch.Size([3, 32, 32]) print(f"图片标签索引:{label_idx}") # 输出:6(对应类别“青蛙”) # 5.2 定义CIFAR-10类别名称(对应索引0-9) cifar10_classes = [ '飞机', '汽车', '鸟', '猫', '鹿', '狗', '青蛙', '马', '船', '卡车' ] print(f"图片对应类别:{cifar10_classes[label_idx]}") # 输出:青蛙 # 5.3 预处理还原(因为Normalize后数值不在0-1,需要反归一化才能正常显示) # 反归一化公式:img = (img_tensor * std) + mean mean = np.array([0.4914, 0.4822, 0.4465]) std = np.array([0.2470, 0.2435, 0.2616]) # Tensor→numpy,维度从[C,H,W]→[H,W,C](matplotlib需要这个顺序) img_np = img_tensor.numpy().transpose((1, 2, 0)) img_np = img_np * std + mean # 反归一化 img_np = np.clip(img_np, 0, 1) # 确保数值在0-1之间(避免归一化后溢出) # 5.4 可视化图片 plt.figure(figsize=(4, 4)) # 设置图片大小 plt.imshow(img_np) # 显示图片 plt.title(f"Label: {cifar10_classes[label_idx]} (索引{label_idx})") plt.axis('off') # 隐藏坐标轴 plt.show()图像数据与显存知识点回顾
1. 图像数据的格式:灰度和彩色数据
2. 模型的定义
3. 显存占用的 4 种地方:
- 模型参数 + 梯度参数
- 优化器参数
- 数据批量所占显存
- 神经元输出中间状态
4. batchsize 和训练的关系
@浙大疏锦行