作者(文火冰糖的硅基工坊)
目录
第1章 Tensor运算概述
1.1 概述
PyTorch提供了大量的张量运算,基本上可以对标Numpy多维数组的运算,以支持对张量的各种复杂的运算。
这些操作运算中大多是对数组中每个元素执行相同的函数运算,并获得每个元素函数运算的结果序列,这些序列生成一个新的同维度的数组。
https://www.runoob.com/numpy/numpy-linear-algebra.html
不同维度张量的维度方向标识
- 随着张量维度的增加,张量维度的标识dim的范围也在扩宽
- 在张量维度扩展的过程中,维度标识值(dim=n)的含义也在发生变化。
- dim=0总是指向张量的多维数组存储的最外层:[ ] [ ] [ ], 这与物理存储的标识是相反的。
1.2 运算分类
(1)算术运算:加、减、系数乘、系数除
(2)函数运算:sin,cos
(3)取整运算:上取整、下取整
(4)统计运算:最大值、最小值、均值
(5)比较运算:大于,等于,小于、排序
(6)线性代数运算:矩阵、点乘、叉乘
1.3 张量的操作与变换
(1)变换内容: 变换张量元素的值。
(1)变换长度:变换张量的某个方向的长度(即向量的维度或长度),长度可增加,可减少。
(3)变换维度:变化张量的维度,维度可以增加,可减少。
1.4 环境准备
import numpy as np
import torch
print("Hello World")
print(torch.__version__)
print(torch.cuda.is_available())
1.5 张量的操作 - 拼接与堆叠
张量的拼接有两种主要的基本策略:
- 不增加张量的维度,只增加某个维度方向的长度:cat()
- 增加张量的维度,不增加单个维度方向的长度:stack()
第2章 增加张量长度的拼接:cat()
2.1 基本原理
2.2 函数说明
功能:在不改变张量维度的情况下,通过增加张量在某个维度方向的长度,把两个张量拼接起来。
原型:cat(input, dim)
输入参数:
input: 输入张量
dim:拼接的方向
2.3 代码示例
(1)按照dim =0 的方向拼接
# 张量的拼接:阶数不变,增加dim方向的长度
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)
print("\n按照dim=0方向拼接")
c = torch.cat((a,b),dim=0)
print(c)
print(c.shape)
输出:
源张量
tensor([[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
[5., 5., 5., 5.],
[5., 5., 5., 5.]])
torch.Size([3, 4])
按照dim=0方向拼接
tensor([[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[5., 5., 5., 5.]])
torch.Size([6, 4])
(2)按照dim=1的方向进行拼接
# 张量的拼接:增加阶数,
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)
print("\n按照dim=0方向拼接:扩展阶数")
c = torch.stack((a,b),dim=0)
print(c)
print(c.shape)
输出:
源张量
tensor([[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
[5., 5., 5., 5.],
[5., 5., 5., 5.]])
torch.Size([3, 4])
按照dim=1方向拼接
tensor([[1., 1., 1., 1., 4., 4., 4., 4.],
[2., 2., 2., 2., 5., 5., 5., 5.],
[3., 3., 3., 3., 5., 5., 5., 5.]])
torch.Size([3, 8])
第3章 增加张量维度的拼接:stack()
3.1 基本原理
stack堆叠,可以增加一个维度,因此案例中dim=0,1,2 三种情形,在三种方向进行堆叠。
(1)按照dim = 0的方向堆叠
(2)按照dim = 1的方向堆叠
(3)按照dim = 2的方向堆叠
2.2 函数说明
功能:通过增加张量维度,把两个张量堆叠起来,堆叠后,维度增加1.
原型:stack(input, dim)
输入参数:
input: 输入张量
dim:拼接的方向,这里的dim是指拼接后张量的dim,而不是原张量的dim
2.3 代码示例
(1)dim=0的方向
# 张量的拼接:增加阶数,
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)
print("\n按照dim=0方向拼接:扩展阶数")
c = torch.stack((a,b),dim=0)
print(c)
print(c.shape)
输出:
源张量
tensor([[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
[5., 5., 5., 5.],
[5., 5., 5., 5.]])
torch.Size([3, 4])
按照dim=0方向拼接:扩展阶数
tensor([[[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.]],
[[4., 4., 4., 4.],
[5., 5., 5., 5.],
[5., 5., 5., 5.]]])
torch.Size([2, 3, 4])
(2)dim=1的方向
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)
print("\n按照dim=1方向拼接:扩展阶数")
c = torch.stack((a,b),dim=1)
print(c)
print(c.shape)
输出:
源张量
tensor([[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
[5., 5., 5., 5.],
[5., 5., 5., 5.]])
torch.Size([3, 4])
按照dim=1方向拼接:扩展阶数
tensor([[[1., 1., 1., 1.],
[4., 4., 4., 4.]],
[[2., 2., 2., 2.],
[5., 5., 5., 5.]],
[[3., 3., 3., 3.],
[5., 5., 5., 5.]]])
torch.Size([3, 2, 4])
(3)dim=2的方向
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)
print("\n按照dim=2方向拼接:扩展阶数")
c = torch.stack((a,b),dim=2)
print(c)
print(c.shape)
输出:
源张量
tensor([[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
[5., 5., 5., 5.],
[5., 5., 5., 5.]])
torch.Size([3, 4])
按照dim=2方向拼接:扩展阶数
tensor([[[1., 4.],
[1., 4.],
[1., 4.],
[1., 4.]],
[[2., 5.],
[2., 5.],
[2., 5.],
[2., 5.]],
[[3., 5.],
[3., 5.],
[3., 5.],
[3., 5.]]])
torch.Size([3, 4, 2])