美文网首页神经网络与深度学习
PyTorch深度学习笔记(1):张量

PyTorch深度学习笔记(1):张量

作者: 陆仔的自在生活 | 来源:发表于2022-12-27 16:55 被阅读0次

张量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原生的数(标量)则不可以。

高维张量

三维及三维以上的张量。

张量的形变

  • .flatten()
  • .reshape()

特殊张量的创建

方法 解释
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() 张量转换为数值

张量的深拷贝

  • t.clone()

张量的索引

一维张量的索引

  • [起始:结束:间隔]
  • 起始位包含
  • 结束位不包含
  • 间隔位置上的数字必须大于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) e^{t}
torch.expm1(t) e^{t} - 1
torch.exp2(t) 2^{t}
torch.pow(t,n) t^n
torch.sqrt(t) \sqrt{t}
torch.square(t) t^2
torch.log10(t) \log_{10} (t)
torch.log(t) \log_{e} (t)
torch.log2(t) \log_{2} (t)
torch.log1p(t) \log_{e} (t+1)
torch.sin(t) sin(t)
torch.cos(t) cos(t)
torch.tan(t) 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分解

相关文章

网友评论

    本文标题:PyTorch深度学习笔记(1):张量

    本文链接:https://www.haomeiwen.com/subject/rcpnqdtx.html