主要涉及两个类:Dataset、Dataloader
Dataset主要是提供一种方式去获取数据及其label。
功能:
1.如何获取每一个数据及其label
2.告诉我们总共有多少个数据
from torch.utils.data import Dataset
自己的数据类需要继承Dataset,作为它的子类。
需要写__getitem__方法和__len__方法
Dataloader主要是对数据进行打包,为后面的网络提供不同的数据形式。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter(“logs”) #创建事件文件夹实例,在项目文件夹中
writer.add_scalar(tag,global_step,scalar_value)
tag(string):图像的标题
global_step(int):对应图像的x轴
scalar_value(float or string/blobname):对应y轴
打开创建的事件文件:
tensorboard --logdir=logs --port=6007
–logdir:事件文件对应所在的文件夹
–port:设置端口,不设置的话参数默认为6006
writer.add_image(tag,img_tensor,global_step,dataformats)
tag(string):图像的标题
img_tensor(torch.Tensor, numpy.array, or string/blobname):图像数据
global_step(int):图像记录值的步数
dataformats:默认为’CHW’,表示“通道”“高度”“宽度”
可以用opencv读取图像,得到numpy类型 或用numpy 把PIL类型转换为numpy类型:
img_PIL = Image.open(image_path)
img_array = np.array(img)
writer.add_image(“test”, img_array, 1, ’HWC’)
from torch vision import transforms
transform的结构及用法:
transforms.py:(工具箱)
ToTensor、resize等(工具,不同的class)
ToTensor:把一个PIL Image类型或numpy.ndarray类型转换为tensor类型
opencv-python:
import cv2
cv_img = cv2.imread(img_path)
#此处得到的cv_img为np.ndarray格式
PIL.Image.open(image_path)得到PIL格式
常见的transforms:
ToTensor():把PIL类型或ndarray类型转换为tensor类型
ToPILImage():把tensor或ndarray类型转换为PIL类型
Compose():把几个操作合并执行。参数需要是一个列表,数据需要是transforms类型,即Compose([transforms参数1, transforms参数2, …])
Normalize():归一化,(input的值-均值)/标准差
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5 ,0.5]),输入为均值和标准差
img_norm = trans_norm(img_tensor)
Resize():把输入的PIL Image 缩放为一个给定的尺寸,return一个PIL Image。可以输入序列(h,w)或者一个int值,参数为int值时把图片h,w中小的一边变为参数值size,大的一边变为size*大/小。
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img)
img_resize = trans_totensor(img_resize)
Compose - Resize - 2
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
RandomCrop():随机裁剪,输入一个序列或一个int值,裁剪为(h,w)大小或(size,size)大小
trans_random = transforms.RandomCrop((500, 1000))
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image(“RandomCrop”, img_crop, i)
总结使用方法:
1.关注输入和输出类型
2.多看官方文档
3.关注方法需要什么参数
4.不知道返回值类型的时候可以print(type())或打断点
参数:
root(string):存放数据集的文件夹
train(bool,optional):为True时,创建训练集,否则创建测试集
download(bool,optional):为真时从网上把数据集下载到本地,如果已经下载过不会重复下载
transform(callable,optional):一个输入PIL Image,输出一个转换了格式的文件的函数
样例:
import torch vision
from torch.utils.tensorboard import SummaryWriter
dataset_transform = torchvision.transforms.Compose([
torchvision.transforms.ToTensor()
])
train_set = torchvision.datasets.CIFAR10(root=“./dataset”, train=True, transform=dataset_transform, download=True)
test_set = torchvision.datasets.CIFAR10(root=‘./dataset’, train=False, transform=dataset_transform, download=True)
writer = SummaryWriter(“p10”)
for i in range(10):
img, target = test_set[i]
writer.add_image(“test_set”, img, i)
writer.close()
可以把数据从数据集加载到神经网络中
常用参数:
dataset(Dataset):需要加载的数据集
batch_size(int,optional):每次从数据集中取多少样本,默认为1
shuffle(bool,optional):每次迭代训练时是否打乱数据的顺序,默认为False,一般喜欢设置为True
num_workers(int,optional):多少个子进程进行加载,默认为0,只用主进程进行加载
drop_last(bool,optional):如果数据集除不尽,是否舍去剩下的采样,默认为False(不舍去)。例如有60000个样本的数据集,每次取7个。
示例:
import torchvision
from torch.utils.data import DataLoader
test_data = torchvision.datasets.CIFAR10(‘./dataset’, train=False, transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)
#测试数据集中第一张图片及其target
img, target = test_data[0]
writer = SummaryWriter(‘’dataloader)
step = 0
#读取test_loader中加载的数据,每个data包括了64个数据
for data in test_loader:
imgs, targets = data
writer.add_images(‘test_data’, imgs, step)
step = step + 1
writer.close()