pytorch cuda入门

刚刚装好一切配置,手头杂活快速清理了来迎接cuda入门的抽打······

pytorch是一个Python科学计算包,它的主要受众是两类人:

  • 想找个numpy的替代品,好利用GPU的强大的人
  • 找个最灵活最快速的深度学习平台的人

本文翻译和参考自pytorch官方教程


查看pytorch和 对应cuda版本

import torch
print(torch.__version__)  #注意是双下划线
1.3.1
print(torch.version.cuda)
10.1

查看自己安装 的cuda版本

C:\Users\Administrator>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:32:27_Pacific_Daylight_Time_2019
Cuda compilation tools, release 10.2, V10.2.89

torch.Tensor

tensor, 张量, 和numpy的ndarray很像,不同的是tensor可以用于GPU加速。是一个支持自动梯度操作的多维数组

用torch创建张量,在cpu或者gpu,Tensors can be moved onto any device using the .to method.

y = torch.ones_like(x, device=device)  # directly create a tensor on GPU
x = x.to(device)                       # or just use strings ``.to("cuda")``

在这里插入图片描述
torch.Tensor是pytorch包的核心类。如果把张量的属性.require_grad设置为True(默认False),则所有操作(加减乘除,函数等任何运算)的梯度都会被追踪,只要调用.backward()方法就可以自动计算出所有的梯度。这个张量的梯度会被累加到.grad属性中。

调用.detach()方法就可以阻止张量追踪所有计算历史和将来的计算操作。还可以把代码块包在with torch.no_grad()中,也能阻止张量去追踪历史(毕竟追踪历史是要使用内存的),当验证和评估模型性能的时候这样做特别有用,代码块里面的张量的属性.require_grad是True也不会追踪。

一般追踪操作历史都是为了后面反向传播计算梯度,所以测试阶段不需要反向传播就不用追踪了。

backprop

如果想计算tensor的导数就直接对它调用.backward()方法,但是需要传入一个tensor参数说明shape.(如果tensor是标量则不用传了)
在这里插入图片描述

举例

从x计算得到out的过程:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
对out执行.backward()方法,求出out关于从x到out的所有中间变量的导数,x.grad就是out关于x的导数
在这里插入图片描述
如果函数的输入输出都是向量,则反向求导得到的就是一个雅克比矩阵了
在这里插入图片描述

Function类

对于自动梯度autograd的实现,除了torch.Tensor之外的一个很重要的包是Function.

Tensor 和 Function包是有联系的,他们一起组建成了一个不循环的计算图,把完整的计算历史都编码记录了。

每个tensor都有一个属性.grad_fn, 是创建出这个tensor的函数,如果tensor是用户定义的,这个属性则是None.

autograd

pytorch中所有神经网络的核心就是autograd包。它提供了tensor上所有操作的自动求导。

It is a define-by-run framework, which means that your backprop is defined by how your code is run, and that every single iteration can be different.

torch.nn

用这个包构建神经网络

nn依赖于autograd来定义模型和求导。

nn.module()方法包含神经网络所有的层和一个方法forward()。只需要自己写写forward函数,backward函数用autograd实现。

神经网络的典型训练流程:

  • 定义一个有可学习参数的网络
  • 通过网络处理输入
  • 计算损失(how far is the output from being correct)
  • 反向传播,计算所有参数的梯度
  • 更新参数,典型更新准则(梯度下降)weight = weight - learning_rate * gradient

torch.nn只支持mini-batch,不可以用a single sample。
在这里插入图片描述

损失函数

损失函数的输入是target,output对,pair,损失函数计算出一个值来估计输出和target的距离

nn.MSELoss

调用loss.backward()则整个计算图都会关于损失求导,实现error的反向传播

torchvision

专为视觉任务设计,里面有常见数据集比如 Imagenet, CIFAR10, MNIST的数据载入器data loader(torchvision.datasets);还有图像的转换器transformer(torch.utils.data.DataLoader.)

windows监视显卡运行

只能通过显存使用率来判断,Windows下也看不到每个程序单独占用的显存,Linux可以

  1. 用任务管理器
    在这里插入图片描述

  2. nvidia-smi.exe
    用everything找到软件位置,我这里出现三个,大概是因为换过驱动,第一个是真正再用的
    在这里插入图片描述
    进行路径使用命令得到gpu使用情况

C:\Users\Administrator>cd C:\Windows\LastGood.Tmp\system32

C:\Windows\LastGood.Tmp\system32>nvidia-smi
Thu Nov 28 12:59:08 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值