张量Tensor是深度学习框架Pytorch中的基础数据结构。类似于Array是Numpy中的基础数据结构一样,tensor及其对应的方法函数,为在Pytorch上进行深度学习建模提供了基本对象和工具。当然,张量的概念并非Pytorch中独有,目前通用的深度学习框架都拥有张量这一数据结构,但使用方法略有差别。
import torch
import numpy as np
张量的创建
创建方式 |
创建命令 |
通过列表创建 |
t = torch.tensor([1, 2]) |
通过元组创建 |
t = torch.tensor((1, 2)) |
通过数组创建 |
a = np.array([1, 2]) t = torch.tensor(a) |
张量的类型
|
整数型 |
浮点型 |
原生创建(元组或列表) |
int64(长整型) |
float32(单精度) |
Numpy array创建 |
int32(整型) |
float64(双精度) |
- 除数值型张量外,常用的还有布尔型张量,即构成张量各元素的都是布尔数据类型。
- 可通过dtype参数,在创建张量的时候设置数据类型:
torch.tensor([2.3, 5.9], dtype=torch.int32)
对于已经创建的张量,可以使用 .int()
, .float()
, .double()
等方法来进行类型的转换。
t = torch.tensor([2, 5])
print(t.dtype)
print(t.float())
print(t.double())
张量的维度
属性/方法 |
解释 |
t.ndim |
张量的维度 |
t.shape 或 t.size() |
张量的形状 |
len(t) |
拥有几个(N-1)维的元素 |
t.numel() |
拥有几个数 |
零维张量
可以理解为数学上的一个数,但是拥有张量的属性。零维张量可以在GPU上运算,而Python原生的数(标量)则不可以。
高维张量
三维及三维以上的张量。
张量的形变
特殊张量的创建
方法 |
解释 |
torch.zeors() |
全零 |
torch.ones() |
全一 |
torch.eye() |
单位矩阵 |
torch.diag() |
对角矩阵 |
torch.rand() |
0-1分布 |
torch.randn() |
标准正态分布 |
torch.normal() |
正态分布(需输入mean, std) |
torch.randint() |
随机整数采样(范围需输入) |
torch.arange() |
生成数列 |
torch.linspace() |
生成数列 |
torch.empty() |
未初始化的矩阵 |
torch.full() |
指定数值填充的矩阵 |
根据现有张量形状创建
注意与现有张量的数据类型保持一致,否则会报错。
- torch.randn_like()
- torch.full_like()
- torch.zeros_like()
张量与其他数据类型的转换
方法 |
解释 |
t.numpy() 或 np.array(t) |
张量转换为numpy array |
t.tolist() 或 list(t) |
张量转换为list |
t.item() |
张量转换为数值 |
张量的深拷贝
张量的索引
一维张量的索引
- [起始:结束:间隔]
- 起始位包含
- 结束位不包含
- 间隔位置上的数字必须大于0,否则会报错
t = torch.arange(10)
t[0] # 得到一个零维张量
t[0:3] # 左闭右开
t[1:5:2]
t[::3]
多维张量的索引
- 与一维张量索引类似:[起始:结束:间隔, 起始:结束:间隔, ...]
张量的函数索引
t = torch.arange(10)
indices = torch.tensor([1, 2])
torch.index_select(t, 0, indices)
- torch.index_select() 第二个参数代表索引维度,表示在tensor的哪个维度上进行索引操作。
tensor.view()
tensor.view()相当于给张量提供一个视图(以不同的形状观察张量),给出的结果与原张量共享一个数据存储空间,因此类似于浅拷贝。
张量的分片函数
张量的分片函数给出的都是原张量的视图,而非一个新的对象。
t = torch.arange(12).reshape(4, 3)
方法 |
解释 |
torch.chunk(t, 4, dim=0) |
将t的第0维分成四等分,原张量不能等分时,不会报错,会返回其他结果 |
torch.split(t, 4, dim=0) |
将t的第0维分成四等分 |
torch.split(t, [1, 3], dim=0) |
将t的第0维按照1/3切分,切分的序列参数之和(此例中为1+3=4)必须等于被切分维度的总长度(此例中tensor t 第0维共有4行) |
张量的合并
方法 |
解释 |
torch.cat([t1, t2], 0) |
将t1, t2 按维度0进行拼接,拼接后维度不变 |
torch.stack([t1, t2], 0) |
将t1, t2 按维度0进行堆叠,堆叠后的维度将会增加 |
张量维度的变换
方法 |
解释 |
torch.squeeze(t) |
去除不必要的维度 |
torch.unsqueeze(t, dim=0) |
在维度0上增加一维 |
张量的科学运算
方法 |
解释 |
torch.add(t1, t2) |
t1 + t2 |
torch.subtract(t1, t2) |
t1 - t2 |
torch.multiply(t1, t2) |
t1 * t2 |
torch.divide(t1, t2) |
t1 / t2 |
torch.abs(t) |
取绝对值 |
torch.ceil(t) |
向上取整 |
torch.floor(t) |
向下取整 |
torch.round(t) |
四舍五入取整 |
torch.neg(t) |
取反 |
torch.exp(t) |
|
torch.expm1(t) |
- 1 |
torch.exp2(t) |
|
torch.pow(t,n) |
|
torch.sqrt(t) |
|
torch.square(t) |
|
torch.log10(t) |
|
torch.log(t) |
|
torch.log2(t) |
|
torch.log1p(t) |
|
torch.sin(t) |
|
torch.cos(t) |
|
torch.tan(t) |
|
torch.mean(t) |
均值 |
torch.var(t) |
方差 |
torch.std(t) |
标准差 |
torch.var_mean(t) |
方差和均值 |
torch.std_mean(t) |
标准差和均值 |
torch.max(t) |
最大值 |
torch.argmax(t) |
最大值索引 |
torch.min(t) |
最小值 |
torch.argmin(t) |
最小值索引 |
torch.median(t) |
中位数 |
torch.sum(t) |
求和 |
torch.logsumexp(t) |
求和,适用于数据量较小的情况 |
torch.prod(t) |
累乘 |
torch.dist(t1, t2) |
计算两个张量的闵式距离,可使用不同范式 |
torch.topk(t) |
返回t中最大的k个值对应的指标 |
torch.eq(t1, t2) |
比较t1、t2各元素是否相等,等效== |
torch.equal(t1, t2) |
判断两个张量是否是相同的张量 |
torch.gt(t1, t2) |
比较t1各元素是否大于t2各元素,等效> |
torch.lt(t1, t2) |
比较t1各元素是否小于t2各元素,等效< |
torch.ge(t1, t2) |
比较t1各元素是否大于或等于t2各元素,等效>= |
torch.le(t1, t2) |
比较t1各元素是否小于等于t2各元素,等效<= |
torch.ne(t1, t2) |
比较t1、t2各元素是否不相同,等效!= |
张量的线性代数运算
方法 |
解释 |
torch.t(t) |
转置 |
torch.eye(n) |
创建包含n个分量的单位矩阵 |
torch.diag(t) |
以t中各元素,创建对角矩阵 |
torch.triu(t) |
取矩阵t中的上三角矩阵 |
torch.tril(t) |
取矩阵t中的下三角矩阵 |
torch.dot(t1, t2) |
t1、t2 内积 |
torch.mm(t1, t2) |
矩阵乘法 |
torch.mv(t1, t2) |
矩阵乘向量 |
torch.bmm(t1, t2) |
批量矩阵乘法 |
torch.addmm(t, t1, t2) |
矩阵相乘后相加 |
torch.addbmm(t, t1, t2) |
批量矩阵相乘后相加 |
torch.trace(A) |
矩阵的迹 |
torch.matrix_rank(A) |
矩阵的秩 |
torch.det(A) |
计算矩阵A的行列式 |
torch.inverse(A) |
矩阵求逆 |
torch.lstsq(A,B) |
最小二乘法 |
torch.eig(A, eigenvectors=True) |
矩阵的特征值,特征向量 |
torch.svd(C) |
SVD分解 |