张量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分解 |