DataWhales深入浅出Pytorch-第二章
Posted Paul-Huang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataWhales深入浅出Pytorch-第二章相关的知识,希望对你有一定的参考价值。
【DataWhales】深入浅出Pytorch-第二章
1. Pytorch的基本操作
1.1 建立tensor类型(2种方法)
torch.tensor(data,*,dtype=)
int
类型默认是int32
。import torch # 创建tensor,用dtype指定类型。注意类型要匹配 a = torch.tensor(1.0, dtype=torch.float) b = torch.tensor(1 , dtype=torch.long) c = torch.tensor(1.0 , dtype=torch.int8) print(a, b, c)
torch.FloatTensor;torch.IntTensor;torch.IntTensor
# 使用指定类型函数随机初始化指定大小的tensor d = torch.FloatTensor(2,3) e = torch.IntTensor(2) f = torch.IntTensor([1, 2, 3, 4]) print(d,'\\n' ,e, '\\n', f )
1.2 tensor 与 numpy(array)之间的转换
array
tonumpy
# tensor 和 numpy array 之间的相互转换 import numpy as np g = np.array([[1, 2, 3],[4, 5, 6]]) h = torch.tensor(g) print(h) i = torch.from_numpy(g) print(i)
torch
toarray
# tensor 和 numpy array 之间的相互转换 import numpy as np g = np.array([[1, 2, 3],[4, 5, 6]]) h = torch.tensor(g) j = h.numpy() print(j)
[[1 2 3] [4 5 6]]
1.3 tensor常见的构造函数(4个函数)
arange是左开右闭。
rand; ones; zeros; arange
# 常见的构造Tensor的函数
k = torch.rand(2,3)
l = torch.ones(2,3)
m = torch.zeros(2,3)
n = torch.arange(0,10,2)
print(k, '\\n', l, '\\n', m, '\\n', n)
tensor([[0.9137, 0.4723, 0.5141],
[0.0574, 0.3423, 0.1671]])
tensor([[1., 1., 1.],
[1., 1., 1.]])
tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([0, 2, 4, 6, 8])
2. Tensor的基本操作
2.1 查看tensor的维度信息(2种方式)
# 查看tensor的维度信息(两种方式)
print(k.shape)
print(k.size())
2.2 tensor的运算
与矩阵计算类似。
# tensor的运算
o = torch.add(1,k)
print(o)
tensor([[1.9137, 1.4723, 1.5141],
[1.0574, 1.3423, 1.1671]])
2.3 tensor索引
- 与
numpy
类似,用 中括号 \\textbf中括号 中括号,是 从第0个时开始计数 \\textbf从第0个时开始计数 从第0个时开始计数。# 索引方式,与numpy类似 print(o[:,1]) print(o[0,:])
tensor([1.4723, 1.3423]) tensor([1.9137, 1.4723, 1.5141])
2.4 改变形状(view)
-
固定特定的行与列 \\textbf固定特定的行与列 固定特定的行与列
print(o.view((3,2)))
tensor([[1.9137, 1.4723], [1.5141, 1.0574], [1.3423, 1.1671]])
-
只固定行/列 \\colorblue\\textbf只固定行/列 只固定行/列,另外 不确定的列/行用-1表示 \\colorblue\\textbf不确定的列/行用-1表示 不确定的列/行用-1表示,torch会 自动计算出对应的列/行 \\colorblue\\textbf自动计算出对应的列/行 自动计算出对应的列/行。
print(o.view(-1,2))
tensor([[1.9137, 1.4723], [1.5141, 1.0574], [1.3423, 1.1671]])
2.5 扩展&压缩tensor的维度:unsqueeze/squeeze
因为unsqueeze/squeeze
只对维度为1
\\colorblue\\textbf只对维度为1
只对维度为1的进行操作。
-
先进性扩展
unsqueeze
print(o) r = o.unsqueeze(1) print(r) print(r.shape)
tensor([[1.2652, 1.0650, 1.5593], [1.7864, 1.0015, 1.4458]]) tensor([[[1.2652, 1.0650, 1.5593]], [[1.7864, 1.0015, 1.4458]]]) torch.Size([2, 1, 3])
-
在对
tensor
进行压缩squeeze
。 只对维度为1 \\colorblue\\textbf只对维度为1 只对维度为1的进行操作。s = r.squeeze(0) print(s) print(s.shape)
tensor([[[1.2652, 1.0650, 1.5593]], [[1.7864, 1.0015, 1.4458]]]) torch.Size([2, 1, 3])
-
只对维度为1 \\colorblue\\textbf只对维度为1 只对维度为1的进行操作。
t = r.squeeze(1) print(t) print(t.shape)
tensor([[1.2652, 1.0650, 1.5593], [1.7864, 1.0015, 1.4458]]) torch.Size([2, 3])
3. 自动求导
自动求导主要用于反向传播,Tensor数据结构是实现自动求导的基础。
3.1 数学基础
- 多元函数求导的雅克比矩阵
J = ( ∂ y 1 ∂ x 1 ⋯ ∂ y 1 ∂ x n ⋮ ⋱ ⋮ ∂ y m ∂ x 1 ⋯ ∂ y m ∂ x n ) (1) J=\\left(\\beginarrayccc \\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 \\endarray\\right)\\tag1 J=⎝⎜⎛∂x1∂y1⋮∂x1∂ym⋯⋱⋯∂xn∂y1⋮∂xn∂ym⎠⎟⎞(1) - 复合函数求导的链式法则 若 h ( x ) = f ( g ( x ) ) h(x)=f(g(x)) h(x)=f(g(x)),则 h ′ ( x ) = f ′ ( g ( x ) ) ⋅ g ′ ( x ) h^\\prime(x)=f^\\prime(g(x)) \\cdot g^\\prime(x) h′(x)=f′(g(x))⋅g′(x)。
- 假设是一层神经网络,则
PyTorch自动求导提供了计算雅克比乘积的工具
\\textbfPyTorch自动求导提供了计算雅克比乘积的工具
PyTorch自动求导提供了计算雅克比乘积的工具。
- 损失函数
l
l
l对输出
y
y
y的导数是:
v = ( ∂ l ∂ y 1 ⋯ ∂ l ∂ y m ) (2) v=\\left(\\beginarraylll \\frac\\partial l\\partial y_1 & \\cdots & \\frac\\partial l\\partial y_m \\endarray\\right)\\tag2 v=(∂y1∂l⋯∂ymDataWhales深入浅出Pytorch-第二章
- 损失函数
l
l
l对输出
y
y
y的导数是: