一、Tensor介绍
1.1、 张量是什么?
最开始在出现CPU和GPU, GPU出现主要解决的问题时并行计算,在此基础上的软件层面的工作基本上围绕着并行计算进行的,张量也不例外。
首先,我们先来聊聊 编程语言,python,java ,C,C++等,他们都有的共同特点是什么?在大学中计算机类专业耳熟能详, 算法、数据结构 等等。其实这些语言对于使用者来说仅仅是语法的差异,解决同一个问题它们的核心本质数据结构和算法都没有发生太大的变化。一门语言的语法你掌握了然于心,其实编程就像“搭积木”。然而 深度学习和编程语言有很多相似的地方。pytroch其实就像是一个工具,让你能够用这些“积木”的最小单元进行搭积木。为什么称之为“积木的最小单元”? 看完后面内容你就明白了。
tensor本质上就是pytorch定义的一种数据结构。它像 python 中的list, 像numpy的数组,它这里仅仅称之为“像”。
tensor的严格定义 :张量是一个多维数组,它是标量、向量、矩阵的高维拓展。
他是有多种形态,这个形态与它的维度有很大关系。
- 0维:标量 ,理解为一个数字
- 1维:向量, 一列或一行数字,这里和线性代数的含义共通。
- 二维:矩阵, 理解就是军训时排列的方阵,里面的人就像是数字。
- 多维:多维数组,现实世界图片, 就是 3*W*H 的0~255数字组成的多维数组。
Tensor 就是用来在计算机中表示它们的,可以理解为一个形状可以变化的 box, 为什么不称为箱子,通常惯性思考为立体3维,但box 可以是人脑想象不出来的维度。不要进入高维时,不要试图去画面模拟它,单纯把维度看成一个数字就行。
练习:
import torch
ten1 = torch.tensor(1)
print(type(ten1),"ten1:",ten1,"ten1 size",ten1.size())
ten2 = torch.tensor([1,2,3,4,5])
print(type(ten2),"ten2:",ten2,"ten2 size",ten2.size())
ten3 = torch.tensor([[1,2,3,4,5],
[2,3,4,5,6],
[7,8,9,5,3]])
print(type(ten3),"ten3:",ten3,"ten3 size",ten3.size())
ten4 = torch.tensor([[[1,2,3,4,5],
[2,3,4,5,6],
[7,8,9,5,3]],
[[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5]]
])
print(type(ten4),"ten4:",ten4,"ten4 size",ten4.size())
输出:
"D:\Program Files\anaconda\envs\pytorch37\python.exe" D:/pyWorkSpace/pytorchStudy/1_tensor.py
<class 'torch.Tensor'> ten1: tensor(1) ten1 size torch.Size([])
<class 'torch.Tensor'> ten2: tensor([1, 2, 3, 4, 5]) ten2 size torch.Size([5])
<class 'torch.Tensor'> ten3: tensor([[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[7, 8, 9, 5, 3]]) ten3 size torch.Size([3, 5])
<class 'torch.Tensor'> ten4: tensor([[[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[7, 8, 9, 5, 3]],[[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5]]]) ten4 size torch.Size([2, 3, 5])Process finished with exit code 0
请注意观察,tensor的size变化,size和tensor的维度是息息相关,在做高维数据时,关注size即可,不建议试图想象形状。
给该环境打上断点,进行调试。
可以看到,tensor数据结构中包含
- data: 包装的Tensor,为什么要包装?用于梯度求导。
- device:当前tensor所在设备, (细心小伙伴发现是cpu,是因为我没有将它放入gpu)
- dtype:张量的数据类型
- layout:表明内存布局(memory layout),即 tensor 在物理设备中的储存结构。学过数据结构的都知道储存结构(物理结构)简单可以分为:顺序储存、链式储存。
- 可选
torch.stried
或torch.sparse_coo
。分别对应顺序储存、离散储存。 - 稠密张量适用
torch.stried
,稀疏张量(0 比较多)适用torch.sparse_coo
。 - shape:张量的形状,本质上存放的就是 size() 函数的值。
二、张量的创建
2.1、直接创建
torch.tenor(data: Any, dtype: Optional[_dtype]=None, device: Union[_device, str, None]=None, requires_grad: _bool=False)
像案例中创建一样,这里介绍下torch.tensor 函数,
- data:数据,可以是list,numpy
- dtype:默认和数据一致,可以强制定义
- device: 设定所在的设备
- requires_grad: 是否需要计算梯度
2.2、从numpy创建tensor
方法:【注意:该方法创建两个变量共享内存】
ten5 = torch.from_numpy(array1)
源码:
案例2:
import torch
import numpy as np
# numpy 创建tensor
list1 = [[[1,2,3,4,5],
[2,3,4,5,6],
[7,8,9,5,3]],
[[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5]]
]
array1 = np.array(list1)
ten5 = torch.from_numpy(array1)
print(type(ten5),"ten5:",ten5,"ten5 size",ten5.size())
<class 'torch.Tensor'> ten5: tensor([[[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[7, 8, 9, 5, 3]],[[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5]]], dtype=torch.int32) ten5 size torch.Size([2, 3, 5])
2.3、数值创建
下面将不一一做示例,可以按照上面的方法进行练习
- tensor.zeros() : 依据size创建全0张量
- torch.zeros_like() : 依据 给的 tensor 的形状,创建一个相同形状的全零张量
- tensor.ones() : 依据size创建全1张量
- torch.ones_like() : 依据 给的 tensor 的形状,创建一个相同形状的全1张量
- torch.full() :依据size创建全给定值张量
- torch.full_like(): 依据 给的 tensor 的形状,创建一个相同形状的全给定值张量
- torch.linspace(): 创建均分的一维张量
- torch.logspace() : 创建对数均分的1维张量
- torch.eye() : 创建单位对角矩阵 (2维)
2.4、依据概率创建
- torch.normal(mean, std ) : 生成正态分布(高斯分布),输入:均值,标准差
有四种模式:均值 【标量,张量】, 标准差 【标量,张量】 2*2 = 4,有四种情况
① 都为张量时:生成的每一个值都来自标准差和均值都不同的正态分布。
②都为标量时,size是指定生成tensor大小,均来自0-1正态分布。
③均值为张量时:生成的每一个值都来自均值都不同的正态分布
④标准差为张量时:生成的每一个值都来自标准差都不同的正态分布
- torch.randn() : 用来生成随机数字的tensor,这些随机数字满足标准正态分布(0~1)。
- torch.randn_like() : 输出如输入tensor形状一样的,和上面相同输出的tensor
- torch.rand() : 均匀分布
- torch.rand_like()
- torch.randint() : 整数均匀分布
- torch.randint_like()
- torch.randperm() ; 生成0~n-1 的随机排列
- torch.nernoulli( g ): 以给定概率,生成伯努利分布
下面这些不用全部记住,会查文档就可以了,
主页 - PyTorch中文文档
PyTorch 中文文档 · PyTorch中文文档 · 看云
文章来源:https://www.toymoban.com/news/detail-669584.html
文章来源地址https://www.toymoban.com/news/detail-669584.html
到了这里,关于【带着学Pytorch】2、张量(Tensor)的介绍与创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!