pytorch使用

一、pytorch使用教程

pytorch是一个基于Python的科学数据包,是numpy的替代品。

Tensors(张量)的使用

tensors类似与numpy中的ndarrays,同时tensors可以进行GPU加速:

  1. tensors的简单使用
import torch
(1)构建一个矩阵,不初始化
x=torch.empty(5,3)
print(x)
显示结果
tensor([[1.0561e-38, 1.0653e-38, 4.1327e-39],[8.9082e-39, 9.8265e-39, 9.4592e-39],[1.0561e-38, 1.0653e-38, 1.0469e-38],[9.5510e-39, 8.7245e-39, 9.0918e-39],[1.0102e-38, 9.6429e-39, 8.7245e-39]])
(2)构造一个5x3随机初始化矩阵
x=torch.rand(5,3)
print(x)
输出:
tensor([[0.4719, 0.3377, 0.4123],[0.8551, 0.5074, 0.5010],[0.9962, 0.7364, 0.4845],[0.5003, 0.7620, 0.9850],[0.0910, 0.4591, 0.5037]])
(3)构造一个全为0的矩阵,而且数据类型是long
x=torch.zeros(5,3,dtype=torch.long)
print(x)
输出:
tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0]])

(4)构造一个张量,直接使用数据

x=torch.tensor([10,2])
print(x)
输出:
tensor([10,  2])

(5)创建一个tensor基于已经存在的tensor

x=x.new_ones(5,3,dtype=torch.double)
print(x)
x=torch.randn_like(x,dtype=torch.float)
print(x)
输入:
tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]], dtype=torch.float64)
tensor([[ 0.9741,  0.4349, -0.3113],[-1.1976,  1.3660, -0.6161],[ 1.1067,  0.6375,  0.6772],[-0.2728,  0.1322, -0.7464],[-0.7105,  0.2207, -0.6240]])

(5)获取tensor的维度

print(x.size())
输出:
torch.Size([5, 3])
  1. tensor运算操作
    (1)加法
    a)方式1
y=torch.rand(5,3)
print(x+y)
输出:
tensor([[ 1.8456,  0.7983,  0.2223],[-0.6282,  1.7030,  0.2376],[ 1.7351,  0.9793,  1.0153],[ 0.4906,  0.5395,  0.1904],[-0.4434,  0.5922, -0.1648]])
 b)方式2
print(torch.add(x,y))
输出:
tensor([[ 1.8456,  0.7983,  0.2223],[-0.6282,  1.7030,  0.2376],[ 1.7351,  0.9793,  1.0153],[ 0.4906,  0.5395,  0.1904],[-0.4434,  0.5922, -0.1648]])
c)方式三,提供一个输出tensor作为参数
result=torch.empty(5,3)
torch.add(x,y,out=result)
print(result)
输出:
tensor([[ 1.8456,  0.7983,  0.2223],[-0.6282,  1.7030,  0.2376],[ 1.7351,  0.9793,  1.0153],[ 0.4906,  0.5395,  0.1904],[-0.4434,  0.5922, -0.1648]])
d)方式四 In-place
y.add_(x)
print(y)
输出:
tensor([[ 1.8456,  0.7983,  0.2223],[-0.6282,  1.7030,  0.2376],[ 1.7351,  0.9793,  1.0153],[ 0.4906,  0.5395,  0.1904],[-0.4434,  0.5922, -0.1648]])

注意任何使张量会发生变化的操作都有一个前缀例如:x.copy(y),x.t(y)都将会改变x的值。
(2)索引操作:可以像使用Numpy一样类似操作进行索引操作:

print(x[:,1])
输出:
tensor([0.4349, 1.3660, 0.6375, 0.1322, 0.2207])

(3)改变矩阵的大小,可以使用torch.view

x=torch.randn(4,4)
y=x.view(16)
z=x.view(-1,8)
print(x.size(),y.size(),z.size())
输出:
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

(4)获取矩阵的值

x=torch.randn(1)
print(x)
print(x.item())#只能是一个数值
输出:
tensor([-0.9619])
0.15692658722400665
  1. pytorch自动微分
    autograd软件包为tensors上所有操作进行自动微分,是pytorch中所有神经网络的核心。,举例如下:
    (1)tensor
    torch.Tensor是包的核心类,将其属性.requires_grad设置为True,则会开始针对tensor的所有操作,完成计算后可以调用反向传播(.backward())来自动计算所有的梯度。张量梯度将累积到.grad属性中。
    要停止tensor历史记录追踪,您可以调用.detach(),他将计算历史记录分离,并防止将来的计算被跟踪。还可以将代码块用with torch.no_grade():进行包装。在评估模型时,特别有用,因为模型在训练阶段具有requires_grad=True的可训练参数有利于调参,但在评估阶段不需要梯度。
    Function类对与autograd实现也非常重要,Tensor和Function互相连接构建一个非循环图,保存整个完整的计算过程的历史信息,每个张量都有一给.grad_fn属性保存着创建张量的Funtion引用,(如果是用户自己创建张量,则grad_fn是None)。
    当计算导数时,调用Tensro.backward()函数,如果Tensor是标量(包含一个元素) 则不需要指定任何参数backward(),但是如果他有更多元素,则需要指定gradient参数指定张量的形状。
    创建一个张量,设置requires_grad=True来跟踪和她相关的计算
import torch
x=torch.ones(2,2,requires_grad=True)
print(x)
输出:
tensor([[1., 1.],[1., 1.]], requires_grad=True)

对张量进行加法操作

y=x+2
print(y)
输出:
tensor([[3., 3.],[3., 3.]], grad_fn=<AddBackward0>)y作为操作的结果被创建,所有它有grad_fnprint(y.grad_fn)输出:<AddBackward0 object at 0x00000200BE883CF8>

二、pytorch神经网络

神经网络可以通过torch.nn包来构建。神经网络是基于自动梯度(autograd)来定义一些模型。一个nn.Module包括层和一个方法forward(input),它会返回输出(output)。
神经网络示意图

1.神经网络训练步骤
1)定义一个包含可训练参数的神经网络
2)迭代整个输入
3)通过神经网络处理输入
4)计算损失(loss)
5)反向传播地图到神经网络的参数
6)更新网络的参数,典型的用一个简单的更新方法:weight=weight-learing_rate*graient
eg:

import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):def __init__(self):super(Net,self).__init__()#1 input image channel,6 output channels,5x5 square convolutionself.conv1=nn.Conv2d(1,6,5)self.conv2=nn.Conv2d(6,16,5)self.f1=nn.Linear(16*5*5,120)self.f2=nn.Linear(120,84)self.f3=nn.Linear(84,10)def forward(self,x):x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))x=F.max_pool2d(F.relu(self.conv2(x)),2)x=x.view(-1,self.num_flat_features(x))x=F.relu(self.f1(x))x=F.relu(self.f2(x))x=self.f3(x)return xdef num_flat_features(self,x):size=x.size()[1:]num_features=1for si in size:num_features*=sireturn num_features
net=Net()
print(net)
输出:
Net((conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(f1): Linear(in_features=400, out_features=120, bias=True)(f2): Linear(in_features=120, out_features=84, bias=True)(f3): Linear(in_features=84, out_features=10, bias=True)
)

上述定义的为一个前馈函数,反向传播函数自动通过autograd进行定义,可以使用任何张量造作上述前馈函数。
模型可训练的参数可以通过调用net.parameters()返回:

params=list(net.parameters())
print(len(params))
print(params[0].size())
输出:
10
torch.Size([6, 1, 5, 5])

现在随机输入一个32x32的数据,期望输入维度是32x32。为了使用这个网络在mnist数据集上,需要将数据集中图片维度进行转为32x32

input = torch.randn(1, 1, 32, 32)
out = net(input)
print(out)
输出:
tensor([[ 0.1033, -0.0183, -0.0104,  0.0989, -0.0257,  0.1024,  0.0198,  0.0920,-0.0248,  0.0471]], grad_fn=<AddmmBackward>)

把所有参数梯度缓存器置零,用随机梯度来反向传播

net.zero_grad()
out.backward(torch.randn(1,10))

计算损失函数:一个损失函数需要一对输入:模型输出和目标,然后计算一个值来评估输出距离离目标有多远。损失函数有多种,一个简单的损失函数就是nn.MSELoss,即为均方差,如下:

output=net(input)
target=torch.randn(10)
target=target.view(1,-1)
criterion=nn.MSELoss()
loss=criterion(output,target)
print(loss)
输出:
tensor(0.6158, grad_fn=<MseLossBackward>)

现在跟随损失到反向传播路径,可以使用.grad_fn属性,在调用loss.backward(),整个图都会微分,而且所有的在图中的requires_grad=True的张量将会让他们的grad张量累计梯度。

print(loss.grad_fn)
print(loss.grad_fn.next_functions[0][0])
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])
输出:
<MseLossBackward object at 0x000001E83B90C9E8>
<AddmmBackward object at 0x000001E83B90CA20>
<AccumulateGrad object at 0x000001E83B90C9E8>

反向传播:我们仅仅需要使用loss.backward()。在调用之前先清空现存的梯度,避免造成梯度堆积。调用loss.backward(),观察con1反向传播之前和之后的变化:

net.zero_grad()
print("反向传播之前:")
print(net.conv1.bias.grad)
loss.backward()
print("反向传播之后:")
print(net.conv1.bias.grad)
输出:
反向传播之前:
tensor([0., 0., 0., 0., 0., 0.])
反向传播之后:
tensor([-0.0007, -0.0042,  0.0081,  0.0041, -0.0063, -0.0021])

更新神经网络参数,最简单的更新规则是随机梯度下降:即为:weight=weight-learing_rate*gradient,也可使用不同的更新规则,类似SGD,Nesterow-SGD,Adam,RMHProp等,梯度下降实例如下:

learing_rate=0.01
for i in net.parameters():i.data.sub_(i.grad.data*learing_rate)
import torch.optim as optim
optimizer=optim.SGD(net.parameters(),lr=0.01)
optimizer.zero_grad()
output=net(input)
loss=criterion(output,target)
loss.backward()
optimizer.step()[1]: http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference[2]: https://mermaidjs.github.io/[3]: https://mermaidjs.github.io/[4]: http://adrai.github.io/flowchart.js/

pytorch之深度学习相关推荐

  1. PyTorch核心贡献者开源书:《使用PyTorch进行深度学习》完整版现已发布!

    来源|新智元 [导读]<使用PyTorch进行深度学习>一书的完整版现已发布!教你如何使用PyTorch创建神经网络和深度学习系统,内含图解与代码,操作易上手. 由Luca Antiga. ...

  2. Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配、对应版本安装之详细攻略

    Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配.对应版本安装之详细攻略 目录 深度学习中pytorch/torchvision版本和CUDA版本最正确 ...

  3. DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略

    DL框架之PyTorch:PyTorch的简介.安装.使用方法之详细攻略 DL框架之PyTorch:深度学习框架PyTorch的简介.安装.使用方法之详细攻略 目录 PyTorch的简介 1.pyto ...

  4. PyTorch入门-深度学习回顾和PyTorch简介

    一.神经网络的复习 1.深度学习 2.神经网络 3.激活函数 4.前向神经网络 5.卷积神经网络 6.循环神经网络 二.用PyTorch构建深度学习模型 深度学习模型框架 TensorFlow ay/ ...

  5. 使用pytorch进行深度学习

    文章目录 使用pytorch进行深度学习 1. 深度学习构建模块:仿射变换, 非线性函数以及目标函数 1.1 仿射变换 1.2 非线性函数 1.3 Softmax和概率 1.4 目标函数 2. 优化和 ...

  6. 免费现场课程:使用PyTorch进行深度学习

    Are you interested in learning about Deep Learning? We are hosting a free 6-week live course on our ...

  7. 【项目实战课】从零掌握安卓端Pytorch原生深度学习模型部署

    欢迎大家来到我们的项目实战课,本期内容是<从零掌握安卓端Pytorch原生深度学习模型部署>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战 ...

  8. 基于Pytorch的深度学习激励函数总结

    基于Pytorch的深度学习激励函数总结 1 激励函数定义 2 常见激励函数 2.1 Threshold函数 2.1.1 数学定义 2.1.2 常见性质 2.1.3 Pytorch实现 2.2 Tan ...

  9. Windows 下安装 CUDA 和 Pytorch 跑深度学习

    Windows 下安装 CUDA 和 Pytorch 跑深度学习 一.安装cuda 11.3 1.1 download cuda 11.3 1.2 双击解压 1.3 测完安装是否成功 二.安装Anac ...

  10. pytorch深度学习_了解如何使用PyTorch进行深度学习

    pytorch深度学习 PyTorch is an open source machine learning library for Python that facilitates building ...

最新文章

  1. Spring3 表达式语言(SpEL)介绍
  2. 五个计算机软件,近五个交易日计算机软件概念股市复盘(4月19日)
  3. 连接mongodb,kafka异步处理代码
  4. 台湾印象之八:海角七号
  5. centos 6.0安装杀毒软件clamAV 0.98
  6. MTK 驱动开发(15)---I2C
  7. Jfinal集成Spring
  8. win10恢复出厂设置_电脑Win10系统恢复出厂设置
  9. 构建自己的地理信息空间数据库及与客户端简单交互(内含彩蛋)
  10. 如何使用cmd查看本机IP地址
  11. PLC状态机编程第一篇-状态机介绍
  12. 从零开始学习CANoe 系列文章目录汇总
  13. PC文件在线互传网站推荐
  14. 【uniapp】实现H5微信分享
  15. JAVA利用jsoup爬取百度热点信息
  16. 推荐交互设计师阅读的一本书
  17. 移动端小场景优化方案
  18. 二维图像中的Hessian矩阵(及MATLAB代码)
  19. 计算机c盘小了,为什么电脑C盘空间越来越小?
  20. matlab 产生每次都一样的随机数

热门文章

  1. 三层结构中的数据层设计
  2. Proteus:51仿真入门
  3. java day61【 SpringMVC 的基本概念 、 SpringMVC 的入门 、 请求参数的绑定 、常用注解 】...
  4. Java开发笔记(六十九)泛型类的定义及其运用
  5. 前端开发的工具,库和资源总结
  6. 时刻警戒当前终端目录
  7. Javaworkers团队第五周项目总结
  8. 与走在创业路上的学子交流——记网维“海大快点”创业团队
  9. ArcEngine 固定比例放大缩小
  10. vb6 调用 .Net Dll