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

张量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分解
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容