📚博客主页:knighthood2001
✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
🎃知识星球:【认知up吧|成长|副业】介绍
❤️如遇文章付费,可先看看我公众号中是否发布免费文章❤️
🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!
对于自己的数据集,这里以猫狗分类数据集为例。
为什么这样分,一方面也是为了符合ImageFolder
中数据的输入。
import torch
from torchvision.datasets import ImageFolder
from torchvision import transforms
import torch.utils.data as Data
import matplotlib.pyplot as plt
from model import GoogLeNet, Inception
import torch.nn as nn
import pandas as pd
# 处理和准备训练和验证数据集。
def train_val_data_process():"""处理和划分训练和验证数据集,并返回对应的数据加载器。Returns:tuple: 包含两个数据加载器的元组,分别对应训练集和验证集。"""# 定义数据集的路径ROOT_TRAIN = r'data\train'# 归一化操作,它通常用于图像数据的预处理(TODO 不同数据,归一化的均值和标准差不同)normalize = transforms.Normalize([0.162, 0.151, 0.138], [0.058, 0.052, 0.048])# 首先,图像被调整到224x224的大小,然后转换为PyTorch的Tensor格式,最后应用之前定义的归一化操作。train_transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor(), normalize])# 加载数据集train_data = ImageFolder(ROOT_TRAIN, transform=train_transform)# 80%的数据被分配给训练集,20%的数据被分配给验证集。train_data, val_data = Data.random_split(train_data, [round(0.8*len(train_data)), round(0.2*len(train_data))])# 使用DataLoader类为训练和验证集创建了数据加载器train_dataloader = Data.DataLoader(dataset=train_data,batch_size=16,shuffle=True,num_workers=2)val_dataloader = Data.DataLoader(dataset=val_data,batch_size=16,shuffle=True,num_workers=2)return train_dataloader, val_dataloader
首先,归一化操作的目的是使得神经网络训练的更好。
然后,图像被调整到224x224的大小,然后转换为PyTorch的Tensor格式,最后应用之前定义的归一化操作。
接下来这个ImageFolder
在我的文章:Pytorch的ImageFolder数据加载器 中讲过了。
然后就是random_split
函数了。我在前文也讲过了,这里为什么需要用到round()函数,是因为原始数据被分割为训练集和验证集时,得确保分割长度的总和等于数据集的长度。round函数是用来四舍五入的,而不是都是往下取整。这样就确保了分割长度的总和等于数据集的长度。
接着,使用DataLoader类去创建数据加载器,方便后续训练的时候用。