pytorch阶段性总结1
Dataset类,自定义数据集,想要使用这个类需要重写两个方法__init__和__getitem__
__init__可以用来初始化数据集所在位置的路径,__getitem__用来定义获取数据的方式
from torch.utils.data import Dataset
from PIL import Image
import os
#自定义数据集简单示例
class MyData(Dataset):
#root_dir是数据集所在的一个路径,label_dir是当前数据集中一个分类的名字,参数根据具体情况而定
def __init__(self,root_dir,label_dir):
self.label_dir=label_dir
#os.path.join是将两个dir通过/连接起来
self.path=os.path.join(root_dir,label_dir)
#os.listdir是获取当前目录下所有文件的名字
self.img_path=os.listdir(self.path)
#重写这个方法后可以像使用列表一样使用类
def __getitem__(self,idx):
#拿到这个文件的名字
img_name=self.img_path[idx]
img_item_path=os.path.join(self.path,img_name)
#用Image打开图片获取
img=Image.open(img_item_path)
label=self.label_dir
return img,label
def __len__(self):
return len(self.img_path)
#使用示例
root_dir="dataset/train"
ants_label_dir="ants_image"
bees_label_dir="bees_image"
ants_dataset=MyData(root_dir,ants_label_dir)
bees_dataset=MyData(root_dir,bees_label_dir)
train_dataset=ants_dataset+bees_dataset
tensorboard工具箱中的SummaryWriter是一个记录日志的类
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
#创建一个SummaryWriter类,并传入一个字符串,这个字符串会作为日志文件夹的名字
writer=SummaryWriter("logs")
image_path="data/train/bees_image/16838648_415acd9e3f.jpg"
img_PIL=Image.open(image_path)
img_array=np.array(img_PIL)
#点开源代码可以看到dataformats默认是CHW的排列格式
#def add_image(
# self, tag, img_tensor, global_step=None, walltime=None, dataformats="CHW"
#):
#如果你将img_array打印出来可以发现图片是"HWC"的类型,所以需要再dataformats中指定
#这里的字符串表示在打开日志以后它属于哪一个组别的,第二个参数是要记录的图片支持tensor数据类型
#和ndarray数据类型
writer.add_image("test1",img_array,global_step=0,dataformats='HWC')
#下面是一组图片的添加方式,它会将一组图片整合到一起,假设imgs是一组图片的集合
writer.add_images("test2",imgs,global_step=step)
#scalar标量,标量的添加方式
for i in range(100):
#第一个是x值,第二个是y值
writer.add_scalar("y=2x",2*i,i)
#生成日志完成以后关闭
writer.close()
#打开编译器底下的终端,logdir=日志文件的名字,端口默认6006,输入命令点开链接就可以看到数据的可视化
tensorboard --logdir=logs --port=6007
transforms当中的ToTensor方法,将PIL格式变成tensor格式
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
import cv2
# 用to_tensor读图片
img_path="dataset/train/ants_image/0013035.jpg"
img=Image.open(img_path)
writer=SummaryWriter("logs")
tensor_trans=transforms.ToTensor()
tensor_img=tensor_trans(img)
# 用cv读图片变成ndarray类型
# cv_img=cv2.imread(img_path)
writer.add_image("Tensor_img",tensor_img)
writer.close()
transforms处理图像的常用方法Normalize(mean,std),Resize(size),Compose(transforms),RandomCrop(size)
#Normalize对图像进行标准化处理
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
#读取图片
writer=SummaryWriter("logs")
img=Image.open("image/py.png")
# ToTensor作用是将所有像素值除以255转成一个张量
trans_totensor=transforms.ToTensor()
img_tensor=trans_totensor(img)
writer.add_image("ToTensor",img_tensor)
# Normalize:output[channel]=(input[channel]-mean[channel])/std[channel]
# 使数据分布更标准
trans_norm=transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm=trans_norm(img_tensor)
writer.add_image("Normalize",img_norm,1)
# Resize:传两个参数是指定修改长和宽,传一个参数就是将两边都修改成这个参数
trans_resize=transforms.Resize((512,512))
img_resize=trans_resize(img)
img_resize=trans_totensor(img_resize)
writer.add_image("Resize",img_resize)
# Compose:将多种操作组合在一起
trans_resize_2=transforms.Resize(512)
trans_compose=transforms.Compose([trans_resize_2,trans_totensor])
img_resize_2=trans_compose(img)
writer.add_image("Resize",img_resize_2,1)
# RandomCrop:随机截取图片的一个部分,给的长和宽不能超过图片的长和宽
trans_random=transforms.RandomCrop((295,350))
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+10)
writer.close()
torchvision中数据集的加载,train=True表示训练数据集,False表示测试数据集,root是下载的位置
transform可以传一个Compose,也可以直接传torchvision.transforms.ToTensor()
import torchvision
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)
# print(test_set[0])
# print(test_set.classes)
#
# img,target=test_set[1]
# print(img)
# print(target)
# print(test_set.classes[target])
# img.show()
# print(test_set[0])
writer=SummaryWriter("p10")
for i in range(10):
img,target=test_set[i]
writer.add_image("test_set",img,i)
writer.close()
DataLoader:加载数据
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
# 准备的测试数据集
test_data=torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor())
# shuffle表示是否会随机打乱,batch_size表示每一组有多少个图片,总共有sum/batch_size组,每组的图片都不会重复
# 最后一组可能会出现数量不足的情况,把drop_last设为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)
writer=SummaryWriter("dataloader")
step=0
for data in test_loader:
imgs,targets=data
# print(imgs.shape)
# print(targets)
writer.add_images("test_data",imgs,step)
step=step+1
writer.close()