pytorch
总结:
dir()函数,能让我们知道工具箱,以及工具箱中的分隔区有什么东西。
help()函数,能让我们知道每个工具是如何使用的,工具是使用方法。

代码是以块为一个整体运行的话:
python文件:python文件的块的所有行的代码 优:通用,传播方便,通用于大型项目 缺:需要从头运行a
python控制台:以任意行为块,运行的 优:显示每个变量属性 缺:不利于代码阅读及修改
Jupyter : 优:利于代码阅读及修改 缺:环境需要配置
加载数据(Dataset,Dataloader)
Dataset:提供一种方式去获取数据及其label
Dataloader:为后面的网络提供不同的数据形式
TensorBoard :
from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter("logs") for i in range(100): writer.all_writers("y=x",i,i) writer.close()
需要下载一个tensorboard:pip install tensorboard(在Local中可下载)
然后 tensorboard --logdir=logs --port=6007
点击跳转到tensorboard界面


Python中 __call__的用法
# call可以直接通过括号进行传参 class Person: def __call__(self, name): print("__call__"+"hello" + name) def helllo(self,name): print("hello"+name) person = Person() person.helllo("list") person.__call__("ppp") person("fff")

# 作者: 喻凌超 # 创建时间: 2022/5/7 10:15 from PIL import Image from torch.utils.tensorboard import SummaryWriter from torchvision import transforms writer = SummaryWriter("logs") img = Image.open("images/IMG_9929.JPG") print(img) # ToTensor trans_totensor = transforms.ToTensor() img_tensor = trans_totensor(img) writer.add_image("ToTensor",img_tensor) # Normalize 可以熏染照片 print(img_tensor[0][0][0]) trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5]) # 并不是上面的img immg_norm = trans_norm(img_tensor) print(immg_norm[0][0][0]) writer.add_image("Normalize",immg_norm) writer.close()
Compose()用法
Compose() 中的参数需要是一个列表,Python中,列表的表示形式为[数据1,数据2,。。。。]
在Compose中,数据需要是 transforms类型,所得的,Compose([transforms参数1,transforms参数2,....])
trochvision数据集使用:
# 作者: 喻凌超 # 创建时间: 2022/5/8 14:49 import torchvision from torch.utils.tensorboard import SummaryWriter dataset_transform = torchvision.transforms.Compose([ torchvision.transforms.ToTensor() # 将每一张图片转换为trans数据类型 ]) 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[0] # print(img) # print(target) # img.show() # print(train_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使用:
# 作者: 喻凌超 # 创建时间: 2022/5/8 15:40 import torchvision # batch-size 一次抽取几张图片 # shuffle 在同样的取数据中取出来的数据不相同 # num_workers 是否为多线程 # drop_last 最后数据是否取舍 # 准备的测试数据集 from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter 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=True) # 测试数据集中第一张图片集target img,target = test_data[0] print(img,target) print(target) writer = SummaryWriter("dataloader") for epoch in range(2): step = 0 for data in test_loader: imgs,targets = data writer.add_images("Epoch:{}".format(epoch),imgs,step) step = step + 1 writer.close()
神经网络--nn.Modul的使用
# 作者: 喻凌超 # 创建时间: 2022/5/8 16:34 import torch from torch import nn class Ylc(nn.Module): def __init__(self): super().__init__() def forward(self, input): output = input + 1 return output ylc = Ylc() x = torch.tensor(1.0) output = ylc(x) print(output)

卷积:

import torch import torch.nn.functional as F input = torch.tensor([[1,2,0,3,1], [0,1,2,3,1], [1,2,1,0,0], [5,2,3,1,1], [2,1,0,1,1]]) kernel = torch.tensor([[1,2,1], [0,1,0], [2,1,0]]) # 将上面数组转换为5*5的矩阵 input = torch.reshape(input,[1,1,5,5]) kernel = torch.reshape(kernel,[1,1,3,3,]) print(input.shape) print(kernel.shape) output = F.conv2d(input,kernel,stride = 1) print(output) # padding输入的图像的矩阵上下左右都增加1 output = F.conv2d(input,kernel,stride = 2,padding=1) print(output)

神经网络--卷积层

from turtle import shape import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter dataset = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(),download=True) dataloader = DataLoader(dataset,batch_size=64) class Tudui(nn.Module): def __init__(self) -> None: super(Tudui,self).__init__() self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0) def forward(self,x): x = self.conv1(x) return x tudui = Tudui() writer = SummaryWriter("../logs") step = 0 for data in dataloader: imgs,targets = data output = tudui(imgs) print(imgs,shape) writer.add_images("input",imgs,step) torch.reshape(output,()) writer.add_images("output",output,step) step = step + 1
神经网络--最大池化的使用 (# 可在input池中通过卷积核来筛选出最大的通过output输出)

# 可在input池中通过卷积核来筛选出最大的通过output输出 # 保护原有信息,但是比较模糊
import torch from torch import nn from torch.nn import MaxPool2d input = torch.tensor([[1,2,0,3,1], [0,1,2,3,1], [1,2,1,0,0], [5,2,3,1,1], [2,1,0,1,1]],dtype=torch.float32) input = torch.reshape(input,(-1,1,5,5)) print(input.shape) class Tuidui(nn.Module): def __init__(self) -> None: super(Tuidui,self).__init__() self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False) def forward(self,input): output = self.maxpool1(input) return output tuidui = Tuidui() output = tuidui(input) print(output)
神经网络--线性层


from turtle import shape import torch import torchvision from torch import nn from torch.nn import Linear from torch.utils.data import DataLoader dataset = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(), download=True) dataloader = DataLoader(dataset,batch_size=64) class Tudui(nn.Module): def __init__(self) -> None: super(Tudui,self).__init__() self.linear1 = Linear(196688,10) def forward(self,input): output = self.linear1(input) return output tuidui = Tudui() for data in dataloader: imgs,targets = data print(imgs,shape) output = torch.reshape(imgs,(1,1,1,-1)) print(output.shape) output = tuidui(output) print(output.shape)
神经网络--搭建小实战
# 作者: 喻凌超 # 创建时间: 2022/5/10 13:59 import torch from torch import nn from torch.nn import Conv2d,MaxPool2d,Flatten,Linear class Tuidui(nn.Module): def __init__(self) -> None: super(Tuidui,self).__init__() self.conv1 = Conv2d(3,32,5,padding=2) self.maxpool1 = MaxPool2d(2) self.conv2 = Conv2d(32,32,5,padding=2) self.maxpool2 =MaxPool2d(2) self.conv3 = Conv2d(32, 32, 5, padding=2) self.maxpool3 = MaxPool2d(2) self.flatten = Flatten() self.linear1 = Linear(1024,64) self.linear2 = Linear(64,10) def forward(self,x): x = self.conv1(x) x = self.maxpool1(x) x = self.conv2(x) x = self.maxpool2(x) x = self.conv3(x) x = self.maxpool3(x) x = self.flatten(x) x = self.linear1(x) x = self.linear2(x) return x tuidui = Tuidui() print(tuidui) input = torch.ones((64,3,32,32)) output = tuidui(input) print(output.shape)
# 作者: 喻凌超 # 创建时间: 2022/5/10 14:10 import torch from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential class Tuidui(nn.Module): def __init__(self): super(Tuidui,self).__init__() self.model1 = Sequential( Conv2d(3,32,5,padding=2), MaxPool2d(2), Conv2d(3, 32, 5, padding=2), MaxPool2d(2), Conv2d(3, 64, 5, padding=2), MaxPool2d(2), Flatten(), Linear(1024,64), Linear(64,10), ) def forward(self,x): x = self.model1(x) return x tuidui = Tuidui() print(tuidui) input = torch.ones((64,3,32,32)) output = tuidui(input) print(output.shape)

损失函数和反向传输
损失函数的作用
损失函数的作用,就是计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。
如何使用损失函数呢?具体步骤:
- 用随机值初始化前向计算公式的参数;
- 代入样本,计算输出的预测值;
- 用损失函数计算预测值和标签值(真实值)的误差;
- 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
- goto 2, 直到损失函数值达到一个满意的值就停止迭
# 作者: 喻凌超 # 创建时间: 2022/5/10 15:58 import torch from torch.nn import L1Loss from torch import nn inputs = torch.tensor([1,2,3],dtype=torch.float32) targets = torch.tensor([1,2,5],dtype=torch.float32) inputs = torch.reshape(inputs,(1,1,1,3)) targets = torch.reshape(targets,(1,1,1,3)) loss = L1Loss(reduction='sum') result = loss(inputs,targets) loss_mse = nn.MSELoss() result_mse = loss_mse(inputs,targets) print(result) print(result_mse) x = torch.tensor([0.1,0.2,0.3]) y = torch.tensor([1]) x = torch.reshape(x,(1,3)) loss_cross = nn.CrossEntropyLoss() result_cross = loss_cross(x,y) print(result_cross)
优化器:
# 作者: 喻凌超 # 创建时间: 2022/5/10 16:56 import torchvision import torch from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoader dataset = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(), download=True) dataloader = DataLoader(dataset,batch_size=1) class Tuidui(nn.Module): def __init__(self): super(Tuidui,self).__init__() self.model1 = Sequential( Conv2d(3,32,5,padding=2), MaxPool2d(2), Conv2d(3, 32, 5, padding=2), MaxPool2d(2), Conv2d(3, 64, 5, padding=2), MaxPool2d(2), Flatten(), Linear(1024,64), Linear(64,10), ) def forward(self,x): x = self.model1(x) return x loss = nn.CrossEntropyLoss() tuidui = Tuidui() # 创建一个优化器 optiom = torch.optim.SGD(tuidui.parameters(),lr=0.01) for epoch in range(20): running_loss = 0.0 for data in dataloader: imgs,targets = data outputs = tuidui(imgs) result_loss = loss(outputs,targets) # 将阶数归零 optiom.zero_grad() # 调用阶数 result_loss.backward() # 进行优化 optiom.step() running_loss = running_loss + result_loss print(running_loss)
现有网络模型的使用和修改:
# 作者: 喻凌超 # 创建时间: 2022/5/10 17:30 import torchvision from torch import nn vgg16_false = torchvision.models.vgg16(pretrained=False) vgg16_true = torchvision.models.vgg16(pretrained=True) print(vgg16_true) print(vgg16_false) train_data = torchvision.datasets.CIFAR10('../data',train=True,transform=torchvision.transforms.ToTensor(), download=True) vgg16_true.classifier.add_module('add_linear',nn.Linear(1000,10)) print(vgg16_true) print(vgg16_false) vgg16_false.classifier[6] = nn.Linear(4096,10) print(vgg16_false)
网络模型的加载和保存
# 作者: 喻凌超 # 创建时间: 2022/5/10 22:58 import torch import torchvision # 方式一 加载模型 model = torch.load("vgg16_method1.path") # print(model) # 方式二 加载模型 vgg16 = torchvision.models.vgg16(pretrained=False) vgg16.load_state_dict(torch.load("vgg16_method.path")) # model = torchvision.load("vgg16_method.path") print(vgg16)
# 作者: 喻凌超 # 创建时间: 2022/5/10 22:52 import torch import torchvision vgg16 = torchvision.models.vgg16(pretrained=False) # 模型结构+模型参数 torch.save(vgg16,"vgg16_method1.path") # 模型参数(官方推荐) torch.save(vgg16.state_dict(),"vgg16_method.path")

posted on 2022-05-12 09:01 只想做加法(ylc) 阅读(142) 评论(0) 收藏 举报
浙公网安备 33010602011771号