pytorch基础学习2

"我是土堆"视频加笔记查看【我是土堆 - 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 进入网址后,可以看到图片

总结使用方法:
总结使用方法

  1. 关注输入和输出类型
  2. 多看官方文档
  3. 关注方法需要什么参数:参数如果设置了默认值,保留默认值即可,没有默认值的需要指定(看一下要求传入什么类型的参数)
  4. 不知道变量的输出类型,可以直接print该变量,或者print(type())看结果里显示什么类型,或者断点调试 dubug
  5. 最后要 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()
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值