哈喽,各位同学好,从今天开始,我将不定期分享研究深度学习框架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