一、猫狗数据集的制作
#在数据集制作过程中需要加载的模块
import torch
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from torchvision.transforms import ToPILImage
from torch.utils.data import Dataset, DataLoader
"""
Pytorch中数据集被抽象为一个抽象类torch.utils.data.Dataset,所有的数据集都应该继承这个类,并override以下两项:
.__len__
.__getitem__
"""
class Datasets(Dataset):
mean = [0.4878, 0.4545, 0.4168]
std = [0.2623, 0.2555, 0.2577]
def __init__(self,path):
#获取数据集所在的路径,注意不能把该路径设置太深
self.path = path
#把数据集下的所有图片的文件名列出来,返回的结果是一个列表
self.dataset = os.listdir(self.path)
"""代表样本数量,len(obj)等价于obj.__len__()"""
def __len__(self):
return len(self.dataset)
"""__getitem__返回一条数据或一个样本,obj[index]等价于obj.__getitem__"""
def __getitem__(self,index):
"""
:param item:index
:return: data,target
"""
# 获得数据的标签
name = self.dataset[index]
# 数据集的文件名为i.j.jpeg, 这个标签的第i个位置如果是0表示猫,1则表示狗,第j个位置是图片的个数
name_list = name.split(".")
target =int(name_list[0])
#这里需要注意tensor(target)和Tensor(target)的区别,在one-hot编码的时候可能会出错
#a=[1,2,3]
#torch.tensor(a)------[1,2,3]
#torch.Tensor(a)------[1.,2.,3.]
target = torch.tensor(target)
"数据预处理"
#打开图片(路径的拼接)
img = Image.open(os.path.join(self.path,name))
#归一化
img = np.array(img) / 255
#去均值
img = (img - self.mean) / self.std
datasets = torch.tensor(img, dtype=torch.float32).permute(2, 0, 1)
return datasets, target
```python
"""数据预处理中方差和均值的求解:"""
if __name__ == '__main__':
path = r"E:/cat-dog/datasets/"
dataset = Datasets(path= path)
# 制作加载器,batch_size=7264,相当于把整体的训练图片打包成了一个整体,data_loader包含两坨东西(data,target)
data_loader = DataLoader(dataset= dataset, batch_size=7246, shuffle=True)
# 将data_loader作为一个迭代器进行运算,这里面包含了输入数据和标签,所以后面取第0个位置的数,也就是取输入数据
data = next