Pytorch学习 day06(torchvision中的datasets、dataloader)

torchvision的datasets

  • 使用torchvision提供的数据集API,比较方便,
  • 如果在pycharm中下载很慢,可以URL链接到迅雷中进行下载(有些URL链接在源码里)
  • 用来告诉程序,数据集存储的位置,共有多少样本等
  • 代码如下:
bash 复制代码
import torchvision  # 导入 torchvision 库
# 使用torchvision的datasets模块,模块中包含CIFAR10、CIFAR100、ImageNet、COCO等数据集
train_set = torchvision.datasets.CIFAR10("./Dataset", train = True, download = True)    # root 表示数据集的存储路径,train 表示是否是训练集,download 表示是否需要下载
test_set = torchvision.datasets.CIFAR10("./Dataset", train = False, download = True)
  • CIFAR10数据集的每个样本会输出一个元组,第一个元素是PIL格式的图片,第二个元素是该样本的标签,即class,代码如下:
bash 复制代码
import torchvision  # 导入 torchvision 库
# 使用torchvision的datasets模块,模块中包含CIFAR10、CIFAR100、ImageNet、COCO等数据集
train_set = torchvision.datasets.CIFAR10("./Dataset", train = True, download = True)    # root 表示数据集的存储路径,train 表示是否是训练集,download 表示是否需要下载
test_set = torchvision.datasets.CIFAR10("./Dataset", train = False, download = True)


print(train_set[0])  # 输出训练集的第一个样本 ,输出为一个元组,第一个元素为PIL格式图片,第二个元素为标签,标签表示图片的类别,即class
print(train_set.classes) # 输出数据集的类别,即class
img, target = train_set[0]
print(img)  # 输出图片
print(target)  # 输出标签
print(train_set.classes[target])  # 输出训练集第一个样本图片的类别
  • 对数据集进行transforms变换
    • 注意,只需要在调用数据集API时,填入变换对象、或变换序列即可,由于dataset_transforms是Compose类实例化后的对象,所以直接传入即可,代码如下:
bash 复制代码
import torchvision  # 导入 torchvision 库
from torch.utils.tensorboard import SummaryWriter

dataset_transforms = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor(),  # 将PIL格式图片转换为Tensor格式
])  # Compose函数将多个transforms组合在一起


# 使用torchvision的datasets模块,模块中包含CIFAR10、CIFAR100、ImageNet、COCO等数据集
train_set = torchvision.datasets.CIFAR10("./Dataset", train = True, transform=dataset_transforms, download = True)    # root 表示数据集的存储路径,train 表示是否是训练集,transform 表示对数据集进行的变换,download 表示是否下载数据集
test_set = torchvision.datasets.CIFAR10("./Dataset", train = False, transform=dataset_transforms, download = True)

writer = SummaryWriter("logs")  # 实例化SummaryWriter类,参数log_dir表示日志文件的存储路径
for i in range(10):
    img, target = train_set[i]  
    writer.add_image("train_set_img", img, i) # 将图片写入tensorboard
    
writer.close()  # 关闭SummaryWriter对象
  • tensorboard的展示结果如下:

torchvision中的dataloader

  • datasets的加载器,把数据加载到神经网络中,需要手动设置某些参数,如下:
    • dataset:就是上一节自定义的datasets对象
    • batch_size:每次从数据集中取多少个样本,并打包输入进神经网络
    • shuffle:每轮epoch样本抽取完毕后,需不需要打乱数据集,True--需要,False--不需要
    • num_workers:加载数据集时,采用多少进程来进行加载,默认为0,采用主进程来进行加载
    • drop_last:最后一次抽取样本时,如果不够一个batch_size,剩余的样本是否舍弃,True--舍弃,False--不舍弃
  • 由于dataloader中的sampler默认为RandomSampler随机采样,所以dataloader在每个batch_size中都是以随机策略在数据集中抓取的,如下:
  • 输出结果:
bash 复制代码
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

test_data = datasets.CIFAR10(root="./Dataset", train=False, transform=transforms.ToTensor(), download=True)

test_loader = DataLoader(dataset=test_data, batch_size=4, shuffle=True, num_workers=0, drop_last=False)

# 测试集中的第一个样本图像和标签
img, target = test_data[0]
print(img.shape)
print(target)

# 测试集中的第一个batch的图像和标签
for data in test_loader:
    img, target = data
    print(img.shape)
    print(target)
    break

# 输出结果:
# 第一次:
# Files already downloaded and verified
# torch.Size([3, 32, 32])
# 3
# torch.Size([4, 3, 32, 32])
# tensor([1, 5, 9, 9])

# 第二次:
# Files already downloaded and verified
# torch.Size([3, 32, 32])
# 3
# torch.Size([4, 3, 32, 32])
# tensor([5, 9, 0, 5])
  • 由于dataset中的_ _ getitem _ _方法返回img、target,所以如果batch_size为4,那么dataloader会以4个为一组,分别打包img和target,并返回imgs和targets,如下图:
  • 且返回的imgs和targets都是Tensor数据类型,如下:
  • 同时,由于imgs为Tensor数据类型,且满足(N, C, H, W)的形式,所以可以直接采用tensorboard进行展示输出,如下:
bash 复制代码
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import datasets, transforms

test_data = datasets.CIFAR10(root="./Dataset", train=False, transform=transforms.ToTensor(), download=True)

test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)

# 测试集中的第一个样本图像和标签
# img, target = test_data[0]
# print(img.shape)
# print(target)

# 测试集中的第一个batch的图像和标签
writer = SummaryWriter("logs")
step = 0
for data in test_loader:
    img, target = data
    print(img.shape)
    print(target)
    writer.add_images("test_loadimages", img, step) # 因为img是一个batch的图像,所以要用add_images
    step += 1

writer.close()
  • 展示结果:
相关推荐
xuanyu222 小时前
Linux常用指令
linux·运维·人工智能
Ylucius2 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
LvManBa2 小时前
Vue学习记录之六(组件实战及BEM框架了解)
vue.js·学习·rust
凡人的AI工具箱2 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
LvManBa2 小时前
Vue学习记录之三(ref全家桶)
javascript·vue.js·学习
晓星航2 小时前
Docker本地部署Chatbot Ollama搭建AI聊天机器人并实现远程交互
人工智能·docker·机器人
Kenneth風车2 小时前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
AI小白龙*2 小时前
大模型团队招人(校招):阿里巴巴智能信息,2025届春招来了!
人工智能·langchain·大模型·llm·transformer
空指针异常Null_Point_Ex3 小时前
大模型LLM之SpringAI:Web+AI(一)
人工智能·chatgpt·nlp