"我是土堆"视频加笔记查看【我是土堆 - PyTorch教程】学习随手记
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
#transformer 更多指的是transformer.py文件,可以看作一个工具箱
#一般是特定的图片,经过特定工具,会输出一个结果
#python用法:tensor数据类型
# 通过transformer.ToTensor来看两个问题
# 1 transformer如何使用(python)
# 2 Tensor数据类型
#绝对路径:E:\study\pytorch_learn\pythonProject\hymenoptera_data\hymenoptera_data\train\ants_image\6240329_72c01e663e.jpg
# 相对路径:hymenoptera_data\hymenoptera_data\train\ants_image\6240329_72c01e663e.jpg
#或者前面加'r',或者将\换成/
img_path="hymenoptera_data/hymenoptera_data/train/ants_image/0013035.jpg"
img=Image.open(img_path) #读取图片
# 1 transformer如何使用(python)
#transformer 可以看作一个工具箱 ,提供ToTensor类工具
tensor_trans=transforms.ToTensor() #创建ToTensor类的对象
tensor_img=tensor_trans(img) #传入参数,返回tensor类型数据
print(tensor_img)
# 2 为什么需要Tensor数据类型
#Tensor 数据类型包装了反向神经网络所需要的一些理论基础的参数,如:_backward_hooks、_grad等(先转换成Tensor数据类型,再训练)
writer=SummaryWriter("logs")
writer.add_image("tensor_img",tensor_img)
writer.close()
1.内置函数 call
class Person:
def __call__(self, name): #内置函数 __call__
print("__call__"+"hello "+name)
def hello(self,name):
print("hello "+name)
person=Person() #创建一个对象
person("xuexue") #内置函数,直接传入参数就调用__call__函数
person.hello("xuexue") #调用hello函数来输出
2.函数的使用
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer=SummaryWriter("logs")
img=Image.open("hymenoptera_data/hymenoptera_data/train/ants_image/0013035.jpg")
print(img)
# ToTensor 的使用
#把 PIL Image 或 numpy.ndarray 类型转换为 tensor 类型(TensorBoard 必须是 tensor 的数据类型)
trans_totensor=transforms.ToTensor() ##将类型转换为tensor
img_tensor=trans_totensor(img) ##img变为tensor类型后,就可以放入TensorBoard当中
writer.add_image("totensor",img_tensor)
# Normalize的使用 用平均值/标准差归一化 tensor 类型的 image(输入)
print(img_tensor[0][0][0])
trans_norm=transforms.Normalize([0.1,0.3,0.4],[0.2,0.7,0.8])
# 因为图片有三个通道,所以均值和方差各传三个参数
img_norm=trans_norm(img_tensor)
#公式output[channel] = (input[channel] - mean[channel]) / std[channel]
print(img_norm[0][0][0])
writer.add_image("Normalize",img_norm,4)
#Resize()的使用 --1
# 输入:PIL Image 将输入转变到给定尺寸
#序列:(h,w)高度,宽度;
# 一个整数:不改变高和宽的比例,只单纯改变最小边和最长边之间的大小关系。之前图里最小的边将会匹配这个数(等比缩放)
print(img.size)
trans_size=transforms.Resize((512,512))
#img:pIL -->resize-->image_resize:PIL
image_resize=trans_size(img)
#image_resize:PIL --> totensor --> img_resize:tensor
img_resize=trans_totensor(image_resize)
writer.add_image("Resize",img_resize,0)
#Resize() -2
#Compose()用法,Compose([transformer参数1,transformer参数2,...])
#PIL -->PIL-->tensor,参数1的输出是否和参数2的输入是否匹配
trans_resize_2=transforms.Resize(512)
##compose()就是把两个参数功能整合,第一个参数是改变图像大小,第二个参数是转换类型,
trans_compose=transforms.Compose([trans_resize_2,trans_totensor])
img_resize_2=trans_compose(img)
writer.add_image("Resize",img_resize_2,1)
#RandomCrop()随机裁剪,输入PIL Image
print(img.size)
trans_random=transforms.RandomCrop(300)
trans_compose_2=transforms.Compose([trans_random,trans_totensor])
for i in range(10):
img_crop=trans_compose_2(img) #输入需要PIL_image,img是该类型
writer.add_image("randomcrop",img_crop,i)
print(img_crop)
writer.close()
writer=SummaryWriter("logs")
#SummaryWriter` 类提供了一个高级 API,用于在给定目录中创建事件文件,并向其中添加摘要和事件。 该类异步更新文件内容。 这允许训练程序调用方法以直接从训练循环将数据添加到文件中,而不会减慢训练速度
writer.add_image(tag,img_tensor) #方法
#运行后,在 Terminal 里输入: tensorboard --logdir=logs 进入网址后,可以看到图片
总结使用方法:
总结使用方法
- 关注输入和输出类型
- 多看官方文档
- 关注方法需要什么参数:参数如果设置了默认值,保留默认值即可,没有默认值的需要指定(看一下要求传入什么类型的参数)
- 不知道变量的输出类型,可以直接print该变量,或者print(type())看结果里显示什么类型,或者断点调试 dubug
- 最后要 totensor,在 tensorboard 看一下结果(tensorboard需要tensor数据类型进行显示)
3.torchvision 中的数据集使用
在pytorch官网中有些数据集可以直接下载
train_set=torchvision.datasets.CIFAR10(root="./datasets",train=True,transform=datasets_transformer,download=True)
#root:数据保存的地址
#train:下载的是否是训练集,true:是,false:不是,下载的是测试集
#transform:transformer的方法
#download=True:是否下载数据集
import torchvision
from torch.utils.tensorboard import SummaryWriter
datasets_transformer=torchvision.transforms.Compose([
torchvision.transforms.ToTensor() #把每一张图片(PIL Image或者numpy数据)转化成tensor
])
train_set=torchvision.datasets.CIFAR10(root="./datasets",train=True,transform=datasets_transformer,download=True)
test_set=torchvision.datasets.CIFAR10(root="./datasets",train=False,transform=datasets_transformer,download=True)
# print(test_set[0]) #查看测试集第一个数据,是一个元组:(img, target),target=label(下标)
# #(<PIL.Image.Image image mode=RGB size=32x32 at 0x24A348D3FD0>, 3)
# print(test_set.classes)
# #['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
#
# img,target=test_set[0]
# print(img) #output:<PIL.Image.Image image mode=RGB size=32x32 at 0x2140C422390>
# print(target) #output:3
# print(test_set.classes[target]) #cat
# img.show()
# print(test_set[0])
writer=SummaryWriter("p10")
for i in range(20):
img,target=test_set[i]
writer.add_image("test_set",img,i)
writer.close()
4.dataloader:
dataset:告诉程序中数据集的位置,数据集中索引,数据集中有多少数据(想象成一叠扑克牌)
dataloader:将数据加载到神经网络中,每次从dataset中取数据,通过dataloader中的参数可以设置如何取数据(想象成抓的一组牌)
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#准备的测试数据集
test_data=torchvision.datasets.CIFAR10(root="./datasets",train=False,transform=torchvision.transforms.ToTensor())
test_loader=DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0,drop_last=False)
# dataset=test_data 数据集的名称
# batch_size=64 每次去的图片数量是64,也可以理解为批次
#num_workers:加载数据时采用单个进程还是多个进程,多进程的话速度相对较快,默认为0(主进程加载)。Windows系统下该值>0会有问题(报错提示:BrokenPipeError)
# shuffle=True 是否打乱数据
# drop_last=False:每次取batch_size个数据,若数据集图片的数量不能整除batch_size,该变量设置为False,表示保留剩下的余数,若为true,则舍去.
#测试数据集中的第一张图片即target(标签存放的位置)
img,target=test_data[0]
print(img.shape) #torch.Size([3, 32, 32]),3通道,彩色图片,32*32
print(target) #3:种类是3
writer=SummaryWriter("dataloard")
for epoch in range(2):
step=0
for data in test_loader:
imgs,targets=data
# print(imgs.shape) #输出:torch.Size([4, 3, 32, 32]),4张图片叠加在一起,3通道,32*32
# print(targets) #tensor([3, 6, 9, 2]) 输出4张图片的种类
writer.add_images("Epoch:{}".format(epoch),imgs,step)
step+=1
writer.close()