本章代码:

  • https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/tensor_introduce1.py
  • https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/tensor_introduce1.py

Tensor 的概念

Tensor 中文为张量。张量的意思是一个多维数组,它是标量、向量、矩阵的高维扩展。

标量可以称为 0 维张量,向量可以称为 1 维张量,矩阵可以称为 2 维张量,RGB 图像可以表示 3 维张量。你可以把张量看作多维数组。

Tensor 与 Variable

在 PyTorch 0.4.0 之前,torch.autograd 包中存在 Variable 这种数据类型,主要是用于封装 Tensor,进行自动求导。Variable 主要包含下面几种属性。

  • data: 被包装的 Tensor。
  • grad: data 的梯度。
  • grad_fn: 创建 Tensor 所使用的 Function,是自动求导的关键,因为根据所记录的函数才能计算出导数。
  • requires_grad: 指示是否需要梯度,并不是所有的张量都需要计算梯度。
  • is_leaf: 指示是否叶子节点(张量),叶子节点的概念在计算图中会用到,后面详细介绍。

在 PyTorch 0.4.0 之后,Variable 并入了 Tensor。在之后版本的 Tensor 中,除了具有上面 Variable 的 5 个属性,还有另外 3 个属性。

  • dtype: 张量的数据类型,如 torch.FloatTensor,torch.cuda.FloatTensor。
  • shape: 张量的形状。如 (64, 3, 224, 224)
  • device: 张量所在设备 (CPU/GPU),GPU 是加速计算的关键

关于 dtype,PyTorch 提供了 9 种数据类型,共分为 3 大类:float (16-bit, 32-bit, 64-bit)、integer (unsigned-8-bit ,8-bit, 16-bit, 32-bit, 64-bit)、Boolean。模型参数和数据用的最多的类型是 float-32-bit。label 常用的类型是 integer-64-bit。

Tensor 创建的方法

直接创建 Tensor

torch.tensor()

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)

  • data: 数据,可以是 list,numpy
  • dtype: 数据类型,默认与 data 的一致
  • device: 所在设备,cuda/cpu
  • requires_grad: 是否需要梯度
  • pin_memory: 是否存于锁页内存

代码示例:

arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
# 创建存放在 GPU 的数据
# t = torch.tensor(arr, device='cuda')
t= torch.tensor(arr)
print(t)

输出为:

ndarray的数据类型: float64
tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]], dtype=torch.float64)

torch.from_numpy(ndarray)

从 numpy 创建 tensor。利用这个方法创建的 tensor 和原来的 ndarray 共享内存,当修改其中一个数据,另外一个也会被改动。

代码示例:

arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)# 修改 array,tensor 也会被修改
# print("n修改arr")
# arr[0, 0] = 0
# print("numpy array: ", arr)
# print("tensor : ", t)# 修改 tensor,array 也会被修改
print("n修改tensor")
t[0, 0] = -1
print("numpy array: ", arr)
print("tensor : ", t)

输出为:

修改tensor
numpy array:  [[-1  2  3][ 4  5  6]]
tensor :  tensor([[-1,  2,  3],[ 4,  5,  6]], dtype=torch.int32)

根据数值创建 Tensor

torch.zeros()

torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:根据 size 创建全 0 张量

  • size: 张量的形状
  • out: 输出的张量,如果指定了 out,那么torch.zeros()返回的张量和 out 指向的是同一个地址
  • layout: 内存中布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。
  • device: 所在设备,cuda/cpu
  • requires_grad: 是否需要梯度

代码示例:

out_t = torch.tensor([1])
# 这里制定了 out
t = torch.zeros((3, 3), out=out_t)
print(t, 'n', out_t)
# id 是取内存地址。最终 t 和 out_t 是同一个内存地址
print(id(t), id(out_t), id(t) == id(out_t))

输出是:

tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0]])tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0]])
2984903203072 2984903203072 True

torch.zeros_like

torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False, memory_format=torch.preserve_format)

功能:根据 input 形状创建全 0 张量

  • input: 创建与 input 同形状的全 0 张量
  • dtype: 数据类型
  • layout: 内存中布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。

同理还有全 1 张量的创建方法:torch.ones()torch.ones_like()

torch.full(),torch.full_like()

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建自定义数值的张量

  • size: 张量的形状,如 (3,3)
  • fill_value: 张量中每一个元素的值

代码示例:

t = torch.full((3, 3), 1)
print(t)

输出为:

tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])

torch.arange()

torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建等差的 1 维张量。注意区间为[start, end)。

  • start: 数列起始值
  • end: 数列结束值,开区间,取不到结束值
  • step: 数列公差,默认为 1

代码示例:

t = torch.arange(2, 10, 2)
print(t)

输出为:

tensor([2, 4, 6, 8])

torch.linspace()

torch.linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建均分的 1 维张量。数值区间为 [start, end]

  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)

代码示例:

# t = torch.linspace(2, 10, 5)
t = torch.linspace(2, 10, 6)
print(t)

输出为:

tensor([ 2.0000,  3.6000,  5.2000,  6.8000,  8.4000, 10.0000])

torch.logspace()

torch.logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建对数均分的 1 维张量。数值区间为 [start, end],底为 base。

  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)
  • base: 对数函数的底,默认为 10

代码示例:

# t = torch.linspace(2, 10, 5)
t = torch.linspace(2, 10, 6)
print(t)

输出为:

tensor([ 2.0000,  3.6000,  5.2000,  6.8000,  8.4000, 10.0000])

torch.eye()

torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建单位对角矩阵( 2 维张量),默认为方阵

  • n: 矩阵行数。通常只设置 n,为方阵。
  • m: 矩阵列数

根据概率创建 Tensor

torch.normal()

torch.normal(mean, std, *, generator=None, out=None)

功能:生成正态分布 (高斯分布)

  • mean: 均值
  • std: 标准差

有 4 种模式:

  1. mean 为标量,std 为标量。这时需要设置 size。
    代码示例:
    # mean:标量 std: 标量 # 这里需要设置 size t_normal = torch.normal(0., 1., size=(4,)) print(t_normal)
    输出为:
    tensor([0.6614, 0.2669, 0.0617, 0.6213])
  2. mean 为标量,std 为张量
  3. mean 为张量,std 为标量
    代码示例:# mean:张量 std: 标量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = 1
    t_normal = torch.normal(mean, std)
    print("mean:{}nstd:{}".format(mean, std))
    print(t_normal)
    输出为:
    mean:tensor([1., 2., 3., 4.])
    std:1
    tensor([1.6614, 2.2669, 3.0617, 4.6213])
    这 4 个数采样分布的均值不同,但是方差都是 1。
  4. mean 为张量,std 为张量
    代码示例:# mean:张量 std: 张量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = torch.arange(1, 5, dtype=torch.float)
    t_normal = torch.normal(mean, std)
    print("mean:{}nstd:{}".format(mean, std))
    print(t_normal)
    输出为:
    mean:tensor([1., 2., 3., 4.])
    std:tensor([1., 2., 3., 4.])
    tensor([1.6614, 2.5338, 3.1850, 6.4853])
    其中 1.6614 是从正态分布

    中采样得到的,其他数字以此类推。

torch.randn() 和 torch.randn_like()

torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:生成标准正态分布。

  • size: 张量的形状

torch.rand() 和 torch.rand_like()

torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:在区间 [0, 1) 上生成均匀分布。

torch.randint() 和 torch.randint_like()

randint(low=0, high, size, *, generator=None, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:在区间 [low, high) 上生成整数均匀分布。

  • size: 张量的形状

torch.randperm()

torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)

功能:生成从 0 到 n-1 的随机排列。常用于生成索引。

  • n: 张量的长度

torch.bernoulli()

torch.bernoulli(input, *, generator=None, out=None)

功能:以 input 为概率,生成伯努利分布 (0-1 分布,两点分布)

  • input: 概率值

参考资料

  • 深度之眼 PyTorch 框架班

如果你觉得这篇文章对你有帮助,不妨点个赞,让我有更多动力写出好文章。

我的文章会首发在公众号上,欢迎扫码关注我的公众号张贤同学

pytorch tensor_[PyTorch 学习笔记] 1.2 Tensor(张量)介绍相关推荐

  1. Eigen库学习笔记(五)张量计算

    Eigen库学习笔记(五)张量计算 1.规约操作 2.最值与索引 3.按索引取值 Array of indices 4.类似 where的功能,生成mask 5.reshape 改变形状元素个数不变 ...

  2. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

  3. Linux学习笔记 文件服务Vsftp详细介绍

    Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...

  4. Oracle中job_type,【学习笔记】Oracle DBMS_SCHEDULER详细介绍与使用案例

    天萃荷净 分享一篇关于Oracle DBMS_SCHEDULER详细介绍与使用案例 1.通过DBMS_SCHEDULER.CREATE_JOB直接创建job SQL> create table ...

  5. Unity DOTS 学习笔记1 - ECS 0.50介绍和安装

    Unity DOTS 学习笔记1 - ECS 0.50介绍和安装 为什么学习这个技术 ECS的全称为Entity Component System,是最早由暴雪在GDC2017上提出的一个新的游戏设计 ...

  6. 嵌入式学习笔记——基于Cortex-M的单片机介绍

    基于Cortex-M的单片机介绍 前言 1生产厂商及其产品线 1.1ARM单片机的产品线 1.2命名规则 作业1 2习单片机的资料准备 2.1STM32开发所需手册 2.1.1芯片的数据手册 芯片基本 ...

  7. Dynamic Quantization PyTorch官方教程学习笔记

    诸神缄默不语-个人CSDN博文目录 本文是PyTorch的教程Dynamic Quantization - PyTorch Tutorials 1.11.0+cu102 documentation的学 ...

  8. TLD7002学习笔记(一)-芯片介绍

    文章目录 1. 前言 2. TLD7002-16ES简介 3. TLD7002-16ES基本功能介绍 3.1 引脚和功能框图 3.2 状态机 3.2.1 正常工作时状态机 3.2.2 OTP烧录或者仿 ...

  9. photoshop学习笔记之分辨率与色彩模式介绍

    (一).分辨率 **分辨率设置:**人像300ppi,网页72ppi,扫描图像1000+: **调整分辨率:**图像大小,修改分辨率,需设置重新采样,最好为两次立方(平滑) **分辨率:**屏幕分辨率 ...

最新文章

  1. 27. FormPanel类的defaults属性
  2. oracle to_char函数的使用
  3. 测绘技术设计规定_1:2000地形图项目测绘(航测)技术设计书(文档可下载)
  4. Android的JNI开发涉及的char和string之间的互相转换
  5. 2018全国计算机音乐大赛一等奖,2018全国数字音乐大赛总决赛精彩无限!小学员的技能震惊评委!...
  6. 一天完成一点,进度太慢了啊
  7. 学好java再学c 可以吗_再论学好C的重要性!!!
  8. Python学习——复习5次课(12月2日)
  9. 你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问
  10. Java基础知识强化21:Java中length、length()、size()区别
  11. poj 1087.A Plug for UNIX (最大流)
  12. 学完这个PPT设计课程后,我实现了月入3w+!
  13. AB触摸屏2711P-T12W22A9P、2711P-T10C4A9,2711P-T10C22D8S-B、2711P-T10C22D9P-B、2711P-T12C10D2
  14. java快捷键和快捷指令(基于scode)
  15. it高手与it民工区别
  16. 圣思园张龙-Java SE 第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)
  17. 转阿彪 PHP常见的安全问题
  18. progress中的数据库访问
  19. Halcon做二维码识别
  20. 2021-2025年中国口服降糖药和胰岛素类似物行业市场供需与战略研究报告

热门文章

  1. [scala-spark]5. 伴生类和伴生对象
  2. [OS复习]虚拟存储管理技术 1
  3. ADO.NET连接字符串
  4. pragma名字的来源
  5. 【CyberSecurityLearning 24】kali中间人攻击
  6. 为什么百度网盘显示2055G下载时却显示容量不足
  7. 在数据段DATA中有两个字数据X和Y, 假设X=1122H, Y=3344H, 编程求两个字的和,结果存放到Z单元中.
  8. 插值查找(按比例查找)
  9. C语言再学习 -- 关键字volatile
  10. 以太坊智能合约安全入门了解一下(上)