目录
torch.unsqueeze()和torch.squeeze()
PyTorch的数据类型:Tensor
Tensor,即张量,它是PyTorch中基本的操作对象,简单的理解就是多维矩阵。Tensors与Numpy中的 ndarrays类似,但是在PyTorch中 Tensors 可以使用GPU进行计算。
函数查找
每个章节涉及的函数已经归纳在下方,可以随时查找用法。
一、Tensor的创建
torch.Tensor() | torch.DoubleTensor() |
torch.FloatTensor() | torch.IntTensor() |
torch.zeros() | torch.ones() |
torch.eye() | torch.randn() |
torch.empty() | torch.randperm() |
torch.**_like() torch.ones_like() torch.zeros_like() torch.rand_like() |
torch.range() |
torch.full() |
二、Tensor的运算
2.1 张量元素比较
torch.allclose() | torch.eq() |
torch.equal() | torch.ge() |
torch.gt() | torch.le() |
torch.lt() | torch.ne() |
torch.isnan() |
2.2 基本运算
torch.pow() | torch.exp() |
torch.log() | torch.sqrt() |
torch.rsqrt() | torch.clamp_max() |
torch.clamp_min() | torch.clamp() |
torch.linspace() | torch.matmul() |
torch.t() | torch.inverse() |
2.3 统计相关计算
torch.max() | torch.argmax() |
torch.min() | torch.argmin() |
torch.mean() | torch.sum() |
torch.cumsum() | torch.median() |
torch.std() | torch.cumprod() |
torch.sort() | torch.topk() |
torch.kthvalue() |
2.4 其他的一些函数
torch.abs() | torch,div() |
torch.add() | torch.mm() |
torch.mv() |
三、Tensor的操作
(1)改变张量的形状
torch.reshape() | A.resize_() |
torch.squeeze() | torch.unsqueeze() |
(2)获取张量中的元素
torch.where() | torch.tril() |
torch.triu() | torch.diag() |
(3)拼接与拆分
torch.cat() | torch.stack() |
torch.chunk() | torch.split() |
四、NumPy 转换
torch.from_numpy() | torch.numpy() |
一、Tensor的创建
-
#创建指定大小
-
torch.Tensor(
3.2,
2.4)
-
#指定类型
-
torch.DoubleTensor(
3,
2)
-
torch.FloatTensor([
2,
3,
4,
5])
-
torch.IntTensor(
2,
2)
-
#列表生成
-
torch.Tensor([
1,
2],[
2,
3])
-
#0矩阵
-
torch.zeros(
3,
2)
-
#1矩阵
-
torch.ones(
3,
2)
-
#对角1矩阵
-
torch.eye(
2,
2)
-
#创建一个未被初始化数值的张量
-
torch.empty(
2,
2)
-
#随机张量
-
torch.randn(
2,
2)
-
#随机排列张量
-
torch.randperm(
5)
-
#生成与D同样大小和类型的张量
-
torch.**_like(D)
-
#比如:
-
torch.ones_like(D)
-
torch.zeros_like(D)
-
torch.rand_like(D)
-
#——与torch.randn一样生成的是标准正态分布的随机张量
-
#生成某一范围的张量
-
torch.
range(
1,
20,
2)
-
#起始——终止——步长
-
#0.25全填充
-
torch.full((
3,
3),fill_value=
0.25)
二、Tensor的运算
2.1 张量元素比较
-
#比较两个元素是否接近
-
torch.allclose()
-
#逐元素比较是否相等
-
torch.eq()
-
#判断两个张量是否具有相同的形状和元素
-
torch.equal()
-
#逐元素比较大于等于
-
torch.ge()
-
#逐元素比较大于
-
torch.gt()
-
#逐元素比较小于等于
-
torch.le()
-
#逐元素比较小于
-
torch.lt()
-
#逐元素比较不等于
-
torch.ne()
-
#判断是否为缺失值
-
torch.isnan()
在这里,只需要知道就可以了,如果有需要的时候可以翻书和查函数手册。
2.2 基本运算
张量的基本运算方式,一种是逐元素之间的运算,如加减乘除、幂运算、平方根、对数、数据裁剪等;另一种为矩阵之间的运算,如矩阵相乘、矩阵的转置、矩阵的迹等。
2.2.1 逐元素加减乘除
-
import torch
-
A=torch.arange(
6.0).reshape(
2,
3)
-
B=torch.linspace(
10,
20,steps=
6).reshape(
2,
3)
-
-
print(
"A:",A)
-
print(
"B:",B)
-
C=A+B
-
print(
"逐元素相加:",C)
-
D=A-B
-
print(
"逐元素相减:",D)
-
E=A*B
-
print(
"逐元素相乘:",E)
-
F=B//A
-
print(
"逐元素整除:",F)
A: tensor([[0., 1., 2.], [3., 4., 5.]]) B: tensor([[10., 12., 14.], [16., 18., 20.]]) 逐元素相加: tensor([[10., 13., 16.], [19., 22., 25.]]) 逐元素相减: tensor([[-10., -11., -12.], [-13., -14., -15.]]) 逐元素相乘: tensor([[ 0., 12., 28.], [ 48., 72., 100.]]) 逐元素整除: tensor([[inf, 12., 7.], [ 5., 4., 4.]])
2.2.2 幂运算
计算张量的幂可以使用torch.pow(),或者**运算
-
print(torch.
pow(A,
3))
-
print(A**
3)
tensor([[ 0., 1., 8.], [ 27., 64., 125.]]) tensor([[ 0., 1., 8.], [ 27., 64., 125.]])
2.2.3 指数对数运算
-
#计算张量的指数
-
torch.exp(A)
-
-
#计算张量的对数
-
torch.log(A)
tensor([[ 1.0000, 2.7183, 7.3891], [ 20.0855, 54.5981, 148.4132]])tensor([[ -inf, 0.0000, 0.6931], [1.0986, 1.3863, 1.6094]])
2.2.4 平方根及其倒数
-
#计算张量的平方根
-
print(torch.sqrt(A))
-
print(A**
0.5)
-
#计算张量的平方根倒数
-
print(torch.rsqrt(A))
-
print(
1 / (A**
0.5))
tensor([[0.0000, 1.0000, 1.4142], [1.7321, 2.0000, 2.2361]]) tensor([[0.0000, 1.0000, 1.4142], [1.7321, 2.0000, 2.2361]]) tensor([[ inf, 1.0000, 0.7071], [0.5774, 0.5000, 0.4472]]) tensor([[ inf, 1.0000, 0.7071], [0.5774, 0.5000, 0.4472]])
2.2.5 数据的裁剪
-
#根据最大值裁剪
-
print(torch.clamp_max(A,
4))
-
#根据最小值裁剪
-
print(torch.clamp_min(A,
3))
-
#根据范围裁剪
-
print(torch.clamp(A,
2.5,
4))
tensor([[0., 1., 2.], [3., 4., 4.]]) tensor([[3., 3., 3.], [3., 4., 5.]]) tensor([[2.5000, 2.5000, 2.5000], [3.0000, 4.0000, 4.0000]])
2.2.6 矩阵的运算
-
#矩阵的转置
-
C=torch.t(A)
-
print(
"矩阵的转置",C)
-
#矩阵相乘,A的行数要等于C的列数
-
print(
"矩阵相乘",A.matmul(C))
矩阵的转置 tensor([[0., 3.], [1., 4.], [2., 5.]]) 矩阵相乘 tensor([[ 5., 14.], [14., 50.]])
若A x B = I,I为单位矩阵,则可称A和B互为逆矩阵;一个方阵中,对角线元素的和称为矩阵的迹。
-
C=torch.rand(
3,
3)
-
#矩阵的逆
-
D=torch.inverse(C)
-
print(
"C:",C,
"\n",
"D:",D)
-
#矩阵的迹
-
torch.trace(torch.arange(
9.0).reshape(
3,
3))
C: tensor([[0.9020, 0.8445, 0.5127], [0.4689, 0.5106, 0.8877], [0.7195, 0.3104, 0.5277]]) D: tensor([[-0.0288, -1.3566, 2.3101], [ 1.8526, 0.5072, -2.6532], [-1.0505, 1.5515, 0.3060]])tensor(12.)
2.3 统计相关计算
-
#计算张量中的最大值
-
torch.
max()
-
#计算张量中的最大值位置
-
torch.argmax()
-
#计算张量中的最小值
-
torch.
min()
-
#计算张量中的最小值位置
-
torch.argmin()
- torch.mean() #指定维度计算平均值
- torch.sum() #指定维度求和
- torch.cumsum() #指定维度进行累加和
- torch.median() #指定维度求中位数
- torch.cumprod() #指定维度计算累乘积
- torch.std() #张量标准差
-
#张量排序,分别输出从小到大,与原来对应索引位
-
A=torch.tensor([
12,
34,
25,
11,
67,
32,
29,
30,
99,
55,
23,
44])
-
torch.sort(A)
torch.return_types.sort( values=tensor([11, 12, 23, 25, 29, 30, 32, 34, 44, 55, 67, 99]), indices=tensor([ 3, 0, 10, 2, 6, 7, 5, 1, 11, 9, 4, 8]))
-
#降序排列
-
torch.sort(A,descending=
True)
torch.return_types.sort( values=tensor([99, 67, 55, 44, 34, 32, 30, 29, 25, 23, 12, 11]), indices=tensor([ 8, 4, 9, 11, 1, 5, 7, 6, 2, 10, 0, 3]))
-
#获取张量前几个大的数值以及索引
-
torch.topk(A,
4)
torch.return_types.topk( values=tensor([99, 67, 55, 44]), indices=tensor([ 8, 4, 9, 11]))
-
#获取张量第k小的数值和位置
-
torch.kthvalue(A,
3)
torch.return_types.kthvalue( values=tensor(23), indices=tensor(10))
2.4 其他的一些函数
- torch.abs:返回输入参数的绝对值
- torch.add:用于返回张量与张量或张量与标量的和的Tensor
- torch,div:返回输入参数求商的结果,可以是Tensor与Tensor,Tensor与标量
- torch.mm:矩阵的相乘
- torch.mv:返回输入参数的求积结果作为输出,按照矩阵与向量之间的乘法规则,第一个参数为矩阵,第二个参数为向量,不能颠倒
三、Tensor的操作
(1)改变张量的形状
torch.reshape()
A=torch.arange(12).reshape(3,4)
tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
对于已经生成的可以采用下面的方式
torch.reshape(input=A,shape=(2,-1))
torch.resize_()
A.resize_(2,6)
tensor([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]])
还提供了A.resize_as_(B),可以将A的形状设置为与B相同的形状大小。
torch.unsqueeze()和torch.squeeze()
- torch.unsqueeze()函数在指定维度插入尺寸为1的新张量
- torch.squeeze()函数移除所有维度为1的维度
-
A=torch.arange(
12).reshape(
2,
6)
-
B=torch.unsqueeze(A,dim=
0)
-
print(
"B.shape",B.shape)
-
C=B.unsqueeze(dim=
3)
-
print(
"C.shape",C.shape)
-
D=torch.squeeze(C)
-
print(
"D.shape",D.shape)
-
#移除指定维度为1的维度
-
E=torch.squeeze(C,dim=
0)
-
print(
"E.shape",E.shape)
B.shape torch.Size([1, 2, 6]) C.shape torch.Size([1, 2, 6, 1]) D.shape torch.Size([2, 6]) E.shape torch.Size([2, 6, 1])
(2)获取张量中的元素
切片索引法
-
import torch
-
A=torch.arange(
12).reshape(
1,
3,
4)
-
print(A)
-
print(
"0维度",A[
0])
-
print(
"获取0维度下的矩阵前两行元素\n",A[
0,
0:
2,:])
-
print(
"获取0维度下最后一行的-4至-1列\n",A[
0,-
1,-
4:-
1])
tensor([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]]) 0维度 tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) 获取0维度下的矩阵前两行元素 tensor([[0, 1, 2, 3], [4, 5, 6, 7]]) 获取0维度下最后一行的-4至-1列 tensor([ 8, 9, 10])
获取A中大于5的元素
A[A>5]
tensor([ 6, 7, 8, 9, 10, 11])
筛选条件
-
B=-A
-
torch.where(A>
5,A,B)
#当A>5时为True,返回A的值,否则会返回B的值
tensor([[[ 0, -1, -2, -3], [-4, -5, 6, 7], [ 8, 9, 10, 11]]])
上三角、下三角及对角线元素
-
#获取矩阵下三角
-
print(torch.tril(A,diagonal=
0))
-
#diagonal控制要考虑的对角线
-
print(torch.tril(A,diagonal=-
1))
-
#获取上三角
-
print(torch.triu(A,diagonal=
0))
-
#获取对角线元素
-
C=A.reshape(
3,
4)
-
print(torch.diag(C,diagonal=
0))
-
print(torch.diag(C,diagonal=-
1))
tensor([[[ 0, 0, 0, 0], [ 4, 5, 0, 0], [ 8, 9, 10, 0]]]) tensor([[[0, 0, 0, 0], [4, 0, 0, 0], [8, 9, 0, 0]]]) tensor([[[ 0, 1, 2, 3], [ 0, 5, 6, 7], [ 0, 0, 10, 11]]]) tensor([ 0, 5, 10]) tensor([4, 9])
(3)拼接与拆分
-
A=torch.arange(
6.0).reshape(
2,
3)
-
B=torch.linspace(
0,
10,
6).reshape(
2,
3)
-
#在0维度连接张量
-
C=torch.cat((A,B),dim=
0)
-
C
tensor([[ 0., 1., 2.], [ 3., 4., 5.], [ 0., 2., 4.], [ 6., 8., 10.]])
- torch.stack(),可以将多个张量按照指定的维度进行拼接
- torch.chunk(),可以将张量分割为特定数量的块
- torch.split(),将张量分割为特定数量的块,可以指定每个块的大小
四、NumPy 转换
将一个Torch Tensor转化为Numpy数组是一件轻松的事,反之亦然。
Torch Tensor与Numpy数组共享底层内存地址,修改一个会导致另一个的变化。
Torch Tensor转化为Numpy
-
a=torch.ones(
5)
-
print(a)
-
b=a.numpy()
-
print(
"ndarray",b)
tensor([1., 1., 1., 1., 1.])ndarray [1. 1. 1. 1. 1.]
Numpy转化为Torch Tensor
-
a=numpy.ones(
5)
-
b=torch.from_numpy(a)
-
print(
"n:",a)
-
print(
"t:",b)
n: [1. 1. 1. 1. 1.]
t: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
转载:https://blog.csdn.net/m0_62919535/article/details/128447189
查看评论