深入浅出Pytorch(二)
Task02:pytorch基础知识
张量Tensor
基本认识:
- 一维张量:向量
- 二维张量:矩阵
- 三维张量:时间序列
- 四维张量:图像
- 五维张量:视频
基本用法
导入torch库,从未来的python库中import一个函数,表示将现有版本函数的用法服从未来版本函数用法。也即是说,如果某个版本中出现了某个新的功能特性,而且这个特性和当前版本中使用的不兼容,也就是它在该版本中不符合语言标准,若想要使用的话就需要从future模块导入
from __future__ import print_function
import torch
基本函数(torch.
):
- data:n维数据
- sizes:张量大小
- X、Y:某一张量
函数 | 功能 |
---|---|
tensor(data) | 赋值创建一个张量 |
rand(sizes) | 返回size大小,服从[0,1)均匀分布的张量 |
rand_like(X) | 返回X大小,服从均匀分布的张量 |
randn(sizes) | 返回size大小,服从标准正态分布的张量 |
randn_like(X) | 返回X大小,服从标准正态分布的张量 |
zeros(sizes) | 返回size大小,全0的张量 |
ones(sizes) | 返回size大小,全1的张量 |
eye(sizes) | 返回size大小,主对角线全1的张量(2D) |
arange(f,s,step) | 返回f到s,步长为step的一维张量 |
linspace(f,s,n) | 返回f到s,均分n份的一维张量 |
randperm(n) | 返回0到n-1的随机排列的一维张量 |
empty(size) | 返回size大小的空张量 |
基本属性函数(X.
)
属性 | 功能 |
---|---|
size()/shape | 获取size大小 |
new_zeros(sizes) | 返回size大小,全0的张量 |
new_ones(sizes) | 返回size大小,全1的张量 |
view(size) | 返回size形状的张量(size含-1,则维度取决于另一个值) |
item() | 仅含有一个元素时返回元素值 |
data | 返回张量数据 |
基本操作(X.
)
操作 | 功能 |
---|---|
基本运算 | 同size张量做运算 |
add(X,Y) | 加法运算 |
sub(X,Y) | 减法运算 |
自动求导autograd
基本认识
- 神经网络核心
- 为张量提供自动求导机制
基本操作
属性 | 功能 |
---|---|
requires_grad | true:追踪张量操作 |
backward() | 计算所有梯度(自动累加) |
detach() | 阻止计算记录跟踪 |
grad_fn | 引用创建Tensor自身的Function |
梯度grad
有待补充
标量,数学上,若有向量函数
y
⃗
=
f
(
x
⃗
)
\vec{y}=f(\vec{x})
y
=f(x
),那么
y
⃗
\vec{y}
y
关于
x
⃗
\vec{x}
x
的梯度就是一个雅可比矩阵:
J
=
(
∂
y
1
∂
x
1
⋯
∂
y
1
∂
x
n
⋮
⋱
⋮
∂
y
m
∂
x
1
⋯
∂
y
m
∂
x
n
)
J=\left(\begin{array}{ccc}\frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}} \ \vdots & \ddots & \vdots \ \frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}}\end{array}\right)
J=(∂x1∂y1⋯∂xn∂y1 ⋮⋱⋮ ∂x1∂ym⋯∂xn∂ym) 而 torch.autograd 这个包就是用来计算一些雅可比矩阵的乘积的。例如,如果
v
v
v 是一个标量函数
l
=
g
(
y
⃗
)
l = g(\vec{y})
l=g(y
) 的梯度:
v
=
(
∂
l
∂
y
1
⋯
∂
l
∂
y
m
)
v=\left(\begin{array}{lll}\frac{\partial l}{\partial y_{1}} & \cdots & \frac{\partial l}{\partial y_{m}}\end{array}\right)
v=(∂y1∂l⋯∂ym∂l) 由链式法则,我们可以得到:
v
J
=
(
∂
l
∂
y
1
⋯
∂
l
∂
y
m
)
(
∂
y
1
∂
x
1
⋯
∂
y
1
∂
x
n
⋮
⋱
⋮
∂
y
m
∂
x
1
⋯
∂
y
m
∂
x
n
)
=
(
∂
l
∂
x
1
⋯
∂
l
∂
x
n
)
v J=\left(\begin{array}{lll}\frac{\partial l}{\partial y_{1}} & \cdots & \frac{\partial l}{\partial y_{m}}\end{array}\right)\left(\begin{array}{ccc}\frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}} \ \vdots & \ddots & \vdots \ \frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}}\end{array}\right)=\left(\begin{array}{lll}\frac{\partial l}{\partial x_{1}} & \cdots & \frac{\partial l}{\partial x_{n}}\end{array}\right)
vJ=(∂y1∂l⋯∂ym∂l)(∂x1∂y1⋯∂xn∂y1 ⋮⋱⋮ ∂x1∂ym⋯∂xn∂ym)=(∂x1∂l⋯∂xn∂l)
梯度在反向传播过程中会累加前一次梯度,一般在反向传播之前需把梯度清零。
并行计算
CUDA
- GPU提供的并行计算框架
- GPU执行命令
通过将数据和处理设备分布采取不同措施相互分离融合来达到所谓的并行
分类
- 网络结构分布到不同设备
- 同一层任务分布到不同数据
- 不同任务分布到不同设备,执行相同任务(主流)