PyTorch 知识点归纳 —— 第1篇

2021-07-08 15:22:11 浏览数 (1)

哈喽,各位同学好,从今天开始,我将不定期分享研究深度学习框架PyTorch过程中的一些学习心得和笔记。

福利:文末将附上案例代码文件下载地址】

1. 张量的数据类型

① scalar 标量

② vector 向量

③ matrix 矩阵

④ n-dimensional vector 多维张量

代码语言:javascript复制
# scalar
x1 = torch.tensor(5.0) 

# vector
x2 = torch.tensor([1.0, 2.0])

# matrix
x3 = torch.tensor([[1, 2],
                   [3, 4]])

# n-dimensional vector
x4 = torch.tensor([[[1, 2],
                    [3, 4]],
                   [[5, 6],
                    [7, 8]]])

2. 张量的创建方式

① 通过torch.tensor函数创建张量

代码语言:javascript复制
torch.tensor(range(10))
torch.tensor(np.array([1,2,3,4]))
torch.tensor([1, 2, 3])

② 通过pytorch内置的函数创建张量

代码语言:javascript复制
torch.rand(3,3) # 矩阵元素服从[0,1)上的均匀分布
torch.randn(2,3,4) # 元素服从标准正态分布

③ 通过已知张量创建形状相同的张量

代码语言:javascript复制
x = torch.tensor([[1, 2],
                  [3, 4]])

a1 = torch.zeros_like(x)
a2 = torch.ones_like(x)
a3 = torch.rand_like(x, dtype=float)
a4 = torch.randn_like(x, dtype=float)

3. 和张量维度相关的方法

假设:t = torch.randn(3,4,5)

① t.ndimension() # 获取维度的数目

② t.nelement() #获取张量的总元素数目

③ t.size() #获取该张量每个维度的大小,调用方法 ④ t.shape #获取该张量每个维度的大小,访问属性

⑤ view()方法 : view方法作用于原来的张量,传入改变新张量的形状,新张量的总元素数目和原来张量的元素数目相同。view方法并不改变张量底层的数据,只是改变维度步长的信息。

⑥ reshape()方法 : reshape方法会在形状信息不兼容的时候自动生成一个新的张量,并自动复制原始张量的数据(相当于连续调用view方法和contiguous方法)

代码语言:javascript复制
t = torch.randn(3,4,5)
t.ndimension() # 3
t.nelement() # 60
t.size() # torch.Size([3, 4, 5])
t.shape # torch.Size([3, 4, 5])
t.view(-1, 2, 3)
t.reshape(6, 10)

4. PyTorch中的张量运算

① 涉及单个张量的函数运算

代码语言:javascript复制
t = torch.rand(3,4)
t.sqrt()
torch.sqrt(t)
t.sqrt_()
torch.sum(t)
torch.sum(t, dim=0) # 横轴方向,求和
t.mean()
torch.mean(t, dim=0) # 横轴方向,求均值

② 涉及多个张量的函数运算

代码语言:javascript复制
t1 = torch.tensor([1, 2])
t2 = torch.tensor([3, 4])
# 加法
t1   t2
t1.add(t2)
# 减法
t1 - t2
t1.sub(t2)
# 乘法
t1 * t2
t1.mul(t2)
# 除法
t1 / t2
t1.div(t2)

③ 张量的极值和排序

(1)argmax,argmin返回沿着该维度最大和最小值对应的序号是多少

代码语言:javascript复制
t = torch.randint(0, 20, (3, 4)) # 随机产生0 - 20的整数,3行4列
t.argmax(dim=0) # 横轴方向,最大值所在的索引
t.argmin(dim=0) # 横轴方向,最小值所在的索引
torch.max(t, dim=-1) # 返回最后一个维度的极大值和极大值的位置
torch.min(t, dim=-1) # 返回最后一个维度的极小值和极小值的位置

(2)排序函数sort(默认顺序是从小到大,如果从大到小,需要设置参数descending=True)

代码语言:javascript复制
t = torch.randint(0, 20, (3, 4)) # 随机产生0 - 20的整数,3行4列
t.sort()
t.sort(dim=0) # 横轴方向
t.sort(dim=1) # 纵轴方向
t.sort(dim=1, descending=True) # 纵轴方向,降序

④ 矩阵的乘法

代码语言:javascript复制
a = torch.tensor([[1,2],
                  [3,4]])
b = torch.tensor([[5,6],
                  [7,8]])
torch.mm(a, b) # 方式1
a.mm(b) # 方式2
a @ b # 方式3

⑤ 张量的拼接和分割

(1)torch.stack():指定并创建一个维度,把列表沿着该维度堆叠起来,并返回

代码语言:javascript复制
a = torch.tensor([[1,2],
                  [3,4]])

b = torch.tensor([[5,6],
                  [7,8]])

torch.stack((a,b), dim=0) # 横轴方向
torch.stack((a,b), dim=1) # 纵轴方向

(2)torch.cat():函数通过传入的张量列表指定某一个维度,堆叠后并返回。

代码语言:javascript复制
torch.cat((a,b), dim=0) # 横轴方向
torch.cat((a,b), dim=1) # 纵轴方向

(3)torch.split():输出是张量沿着某个维度分割后的列表。

代码语言:javascript复制
torch.split(a, 1, dim=0) # 横轴方向,分成2块
torch.split(a, 1, dim=1) # 纵轴方向,分成2块

(4)torch.chunk():分割

代码语言:javascript复制
torch.chunk(a, 2,dim=0) # 横轴方向,分成两块
torch.chunk(a, 2,dim=1) # 纵轴方向,分成两块

⑥ 张量维度的扩增和压缩

(1)增加张量的维度:torch.unsqueeze()函数和张量unsqueeze()方法

代码语言:javascript复制
t = torch.rand(3,4)
t.shape # torch.Size([3, 4])
t = t.unsqueeze(-1)
t.shape # torch.Size([3, 4, 1])

(2)压缩张量的维度:torch.squeeze()函数和张量squeeze()方法

代码语言:javascript复制
t = torch.randn(1, 3, 4, 1)
t.shape # torch.Size([1, 3, 4, 1])
t = t.squeeze(-1)
t.shape # torch.Size([1, 3, 4])

⑦ 张量的广播

需要把维度数目比较小的张量扩增到和维度数目比较大的张量一致。

代码语言:javascript复制
t1 = torch.randn(3,4,5)
t2 = torch.randn(3,5)
t1.shape # torch.Size([3, 4, 5])
t2.shape # torch.Size([3, 5])
t2 = t2.unsqueeze(1) 
t2.shape # torch.Size([3, 1, 5])
t3 = t1   t2
t3.shape # torch.Size([3, 4, 5])

代码文件下载地址:

链接:

https://pan.baidu.com/s/1V5saIWCYkaqqzPhb6_bKkA

密码:

w98i

0 人点赞