目录
- 1、基本数据类型
- 2、创建tensor(张量)
- 3、查看tensor的形状和维度
- 4、tensor的索引
- 5、tensor维度操作
- 6、交换维度
- 7、张量的拼接和拆分
- 8、tensor的基本运算
- 8.1 广播机制--broadcast
- 8.2 加/减/乘/除
- 8.3 矩阵相乘
- 8.4 幂和Log运算
- 8.5 最小值、最大值、均值、总和、累乘
- 8.6 `地板除/取余/取商/四舍五入`等操作
- 8.7 `torch.clamp(tensor, min, max)`:压缩张量的值
- 8.8 求范数:`.norm(n)`
- 8.9 返回指定维度上最大/小的前n个数:`.topk(n, dim, largest=False)`
- 8.10 返回第n小的数和下标:`.kthvalue(n, dim)`
- 8.11 比较操作:`<,>,<=,>=,!=,==等等`
- 8.12 比较是否相等:`torch.eq()`/`torch.equal()`
1、基本数据类型
下面和python的数据类型作比较,看看PyTorch的数据类型:
字符串类型没有对应?于是使用了下面的方法对应,这个自行搜索。
1.1 PyTorch数据类型:
下图展示了PyTorch的数据类型,需要注意的是CPU和GPU的数据类型是不一样的:
1.2 如何检测数据类型:
方法一:
a = torch.randn(2, 3) #创建一个正态分布的张量
a.type() # 方法一检测
# 输出:
'torch.FloatTensor'
方法二:
type(a) #这个是python中的
# 输出:
torch.Tensor
方法三:
isinstance(a, torch.FloatTensor)
# 输出:
True
# 将数据放到GPU上:
a = a.cuda()
isinstance(a, torch.cuda.FloatTensor)
#输出:
True
2、创建tensor(张量)
2.1 标量
标量就是我们说的单个数字,这个主要的用途是计算Loss的时候使用。下面看看怎么创建的:
import torch
a = torch.tensor(1.) # 创建了一个标量
a
# 输出:
tensor(1.)
# 看看标量的形状:
a.shape # 或者 a.size()
# 输出:
torch.Size([])
2.2 创建张量
在这里为了不涉及更多的知识,我就先直接把张量理解成了数组或者多维矩阵,以后学习的差不多了,再深入理解。
那如何创建呢?下面来看:
- (1)使用:
torch.tensor([])
- 注意:使用这个需要加[],不然就成了标量了。另外,我这里默认创建的数据类型是torch.FloatTensor。
import torch
a = torch.tensor([1.]) # 注意有方括号,省略了就成了标量了
a.shape
# 输出:
torch.Size([1])
a.type() # 我这里默认是torch.FloatTensor
# 输出:
'torch.FloatTensor'
- (2)使用
torch.Tensor()
- 注意:这个大写的Tensor和前面小写的区别是:这个不加[]创建一个随机化的张量,并且括号里的参数是形状;加了[]则表明里面的数据,和tensor一个功能了。
# 情况一:
torch.Tensor(2,3) # 创建形状为(2, 3)的张量
# 输出:
tensor([[0.0000e+00, 0.0000e+00, 1.4013e-45],
[0.0000e+00, 1.4013e-45, 0.0000e+00]])
# 情况二:
torch.Tensor([2,3]) # 创建[2,3]这个张量
# 输出:
tensor([2., 3.])
- (3)
torch.FloatTensor()
- 这个和torch.Tensor类似,只不过指定了类型。
a = torch.FloatTensor(2,3)
a.shape
# 输出:
torch.Size([2, 3])
关于其他类型,和(2)(3)情况差不多,这里就不再赘述了。
2.3 创建特定张量
- (1)创建全为1的张量:
torch.ones()
或者torch.ones_like()
例子:
a = torch.ones(2,2)
# 输出:
tensor([[1., 1.],
[1., 1.]])
torch.ones_like(a) # 就是按a的形状,创造全1的张量
# 输出:
tensor([[1., 1.],
[1., 1.]])
- (2)创建全为0的张量:
torch.zeros()
或torch.zeros_like()
例子:
a = torch.zeros(3,2)
# 输出:
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
torch.zeros_like(a)# 就是按a的形状,创造全0的张量
# 输出:
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
- (3)创建指定数字的张量:
torch.full([], num)
- []里面是指定的形状,num是用哪个数字填充
例子:
torch.full([2,3], 7)
# 输出:
tensor([[7., 7., 7.],
[7., 7., 7.]])
- (4)从numpy创建:
torch.from_numpy(data)
例子:
data = np.ones(2)
torch.from_numpy(data) # 将numpy的数组类型转换为tensor
# 输出:
tensor([1., 1.], dtype=torch.float64)
- (5)从list导入:
a = [1,2,3]
torch.tensor(a) # 注意:小写的tensor接受数据,大写的接受shape
# 输出:
tensor([1, 2, 3])
- (6)生成未初始化的tensor:
torch.empty()
例子:
torch.empty(2,3) # 2行3列
# 输出:
tensor([[1.3541e-05, 8.5007e-07, 8.4078e-45],
[0.0000e+00, 1.4013e-45, 0.0000e+00]])
注意:这个其实就随机初始化了,有时候初始化的值很大或者很小,所以尽量少用。
- (7)生成序列:
arange()
,和python的range一样,不赘述。
例子:
torch.arange(10,1, -1) # 生成从10到1的整数,第三个参数为间隔,-1为倒着来
- (8)
linspace()/logspace()
linspace()
在一个给定的区间中,将这个区间平均分成几份。logspace()
就是开始结束的10次方,然后在这个区间中均匀取点
例子:
torch.linspace(0, 10, 4) # 把1-10平均分成4份了
# 输出:
tensor([ 0.0000, 3.3333, 6.6667, 10.0000])
torch.logspace(0, 10, 5) # 就是开始结束的10次方,然后在这个区间中均匀取点
# 输出:
tensor([1.0000e+00, 3.1623e+02, 1.0000e+05, 3.1623e+07, 1.0000e+10])
- (9)生成单位矩阵:
eye()
例子:
a = torch.eye(3,3) # 3*3单位矩阵
# 输出:
tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
- (10)生成从0到n-1的的n个数,然后打乱:
torch.randperm(n)
例子:
torch.randperm(9)
# 输出:
tensor([0, 6, 3, 4, 8, 7, 1, 5, 2])
3、查看tensor的形状和维度
(1).size(num)
功能是查看张量的形状。
参数:num指查看第几个维度,缺失默认全部
返回值为张量的形状,从外到内(我指的是[]从外到内)。
例子:
a = torch.randn(2, 3) # 使用正态分布随机初始化2*3列的张量
a.size() # 查看张量的形状,从外到内
# 输出:
torch.Size([2, 3])
a.size(0) # 第0维度的张量大小
# 输出:
2
a.size(1) # 第1维度的张量大小
# 输出:
3
(2).shape
和size()一个效果。
例子:
a = torch.randn(2, 3) # 使用正态分布随机初始化2*3列的张量
a.shape # 和size一个效果
# 输出:
torch.Size([2, 3])
a.shape[0] # 查看第0维度
# 输出:
2
a.shape[1] # 查看第0维度
# 输出:
3
(3).dim
功能:查看张量有几个维度。
例子:
a = torch.randn(2, 3) # 使用正态分布随机初始化2*3列的张量
a.dim
# 输出:
2
4、tensor的索引
- (1)比如要直接取一个张量里的某个数,直接看例子:
a = torch.randn(4, 3, 28, 28) # 创建了(4,3,28,28)形状的张量
a.shape
# 输出:
torch.Size([4, 3, 28, 28])
# 取第一个维度为0,第二个维度为0&