首页 > 其他分享 >【pytorch】理解张量,了解张量的创建和操作

【pytorch】理解张量,了解张量的创建和操作

时间:2023-05-10 21:24:58浏览次数:29  
标签:None Tensor 创建 torch 张量 pytorch input out

深度学习的核心是卷积,卷积的核心是张量(Tensor)

理解 Tensor

Tensor 可以简单理解为是标量、向量、矩阵的高维扩展。你可以把张量看作多维数组,但相较于ndarray,Tensor 包含了grad、requires_grad、grad_fn、device 等属性,是为服务于神经网络而设计的类型,

标量可以看作是零维张量、向量可以看作是一维张量、矩阵可以看作是二维张量。
若把二维张量看作一个平面,三维张量就是多个二维张量平面两两平行摆放。灰度图像是典型的二维张量,RGB图像是典型的三维张量(channel, height, width)。

那怎么理解四维张量、五维张量等高维张量?
在之后的深度学习过程中,我们处理图像时会经常遇到四维张量(batch_size, channel, height, width),表示有 batch_size 个 RGB 图像。更高维的张量无非是在前面添加 batch, 如五维张量(batch', batch, c, h, w)。batch 是高维张量的单位。下面通过简图理解一下高维张量:

将三维张量看成零维张量,那四维张量不就是一维张量,五维张量不就是二维张量了吗!张量的升维其实也是在降维!!!
那么六维张量的简图怎么画,相信大家参照三维张量也不难画出了。

Tensor 的创建方式

直接创建

torch.tensor()

torch.tensor(data, dtype=None, device=None, requires_grad=False)
  • data: 数据,像数组的类型都可以,如list、tuple、numpy.ndarray等
  • dtype: 数据类型,默认与data的数据类型一致
  • device: 所在设备,cuda或cpu
  • requires_grad: 是否需要梯度

代码示例:

t = torch.tensor(np.ones((2, 3)), device='cuda')

torch.from_numpy(ndarray)

torch.from_numpy(ndarray)

从 numpy.ndarray 创建 Tensor,两者共享内存。
代码示例:

a = np.array([1, 2, 3])
t = torch.from_numpy(a)
print(id(a)==id(t)) # 同一内存
# 修改其中一个的数据,另一个也会被改动
a[0] = 11
t[1] = 22
print(a, t)

根据数值创建 Tensor

torch.zeros()

创建全0张量

torch.zeros(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • size(int...): 张量的形状
  • out(Tensor): 输出张量,将新建的张量写入 out 张量中
  • layout: 内存中布局形式,有strided、sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。
t_z = torch.zeros(2, 3)

torch.zeros_like()

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

根据 input 的形状创建全0张量。

input = torch.empty(2, 3)
t_z_l = torch.zeros_like(input)

全1张量(torch.ones()、torch.ones_like())和自定义数值张量(torch.full()、torch.full_like())的创建方式类似全0张量的创建。

input = torch.empty(2, 3)
# 创建全1张量
t_o = torch.ones(2, 3)
t_o_l = torch.ones_like(input)
# 创建自定义值张量
t_f = torch.full((2, 3), 8)
t_f_l = torch.full(input, 8)

torch.arange()

创建等差的一维张量

torch.arange(start=0, end, step=1, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • start: 起始值
  • end: 结束值,右开区间[start, end),取不到end
  • step: 步长,也即公差
t_a = torch.arange(2, 10, 2)

创建均分的一维张量————torch.linspace()
创建对数均分的一维张量————torch.logspace()

torch.eye()

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

创建单位对角矩阵(二维张量)

t_e = torch.eye(3)

根据概率创建 Tensor

torch.normal()

返回一个从均值和标准差已给定的独立正态分布中抽取的随机数张量。

torch.normal(mean, std, *, generator=None, out=None)
  • mean:均值。当为 Tensor 类型时其每一个元素分别作为每个输出随机数对应的正态分布的均值,当为 float 类型时作为全部输出随机数对应的正态分布的均值。
  • std: 标准差。类型同理。

根据 mean 和 std 的类型有四种情形:

# 一. mean和std均为Tensor类型
torch.normal(mean=torch.arange(1., 11.), std=torch.arange(1, 0, -0.1))
'''
tensor([ 0.4438,  2.4659,  2.8171,  4.5146,  4.6359,  5.2487,  7.4859,  7.9697,
         9.2102, 10.0163])
0.4438从分布N(1,1)采样得到,2.4659从分布N(2,0.9)采样得到,其他随机值以此类推。
'''

# 二. mean:float, std: Tensor
torch.normal(mean=0.5, std=torch.arange(1., 6.))
'''
tensor([ 0.9225, -4.9200, -0.8951,  5.7765, -2.3907])
五个随机值采样分布的均值相同,为0.5,标准差不同。
'''

# 三. mean: Tensor, std: float
torch.normal(mean=torch.arange(1., 6.), std=0.5)
'''
tensor([0.7839, 2.0818, 2.2737, 3.9720, 4.9761])
五个随机值采样分布的均值不同,标准差均为0.5
'''

# 四. mean: float, std: float。此时需要设置size表明返回的Tensor形状。
torch.normal(2, 3, size=(1, 4))
'''
tensor([[ 4.2537, -0.9927, -1.4713,  1.4987]])
随机值都是从N(2,3)采样得到
'''

torch.randn()

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

返回一个随机数填充的张量(随机数从N(0,1)取样),张量形状由size决定。

torch.randn(4)
torch.randn(2, 3)

torch.rand()

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

返回一个由区间[0,1)上的均匀分布的随机数填充的张量。

torch.rand(4)
torch.rand(2, 3)

还有 torch.rand_like()、torch.randint()、torch.randperm()、torch.bernoulli()等。

张量操作

张量的操作和ndarray的操作有很多共通之处,就不多赘述了,想了解如何具体使用可以看官方文档,或者在python控制台用 help函数了解。

  • 拼接操作——torch.cat()、torch.stack()
  • 切分操作——torch.chunk()、torch.split()
  • 索引操作——torch.index_select()、torch.mask_select()
  • 变换操作——torch.reshape()、torch.transpose()、torch.t()、torch.squeeze()、torch.unsqueeze()

张量的数学运算

张量的数学运算和 ndarray 的数学运算类似。由于在深度学习中经常使用先乘后加的操作,要关注以下三个运算:

  • torch.add()
  • torch.addcdiv()
  • torch.addcmul()

torch.add()

troch.add(input, other, *, alpha=1, out=None)

计算公式: out = input + alpha * other

torch.addcdiv()

torch.addcdiv(input, tensor1, tensor2, *, value=1, out=None)

计算公式:out = input + value * (tensor1 / tensor2)

torch.addcmul()

torch.addcmul(input, tensor1, tensor2, *, value=1, out=None)

计算公式:out = input + value * tensor1 * tensor2

标签:None,Tensor,创建,torch,张量,pytorch,input,out
From: https://www.cnblogs.com/hzyuan/p/17389358.html

相关文章

  • 【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
    问题描述在中国区Azure上,使用MediaService服务,想要使用.NET的代码来对上传视频创建缩略图(Thumbnail)。通过官网文档(https://docs.azure.cn/zh-cn/media-services/latest/samples/samples-encoding-reference#create-a-thumbnail-sprite)下载.NET示例,配置appsettings.json......
  • mysql创建systemd管理项
    vim/usr/lib/systemd/system/mysqld.service写入system配置:[Unit]Description=MySQLServerDocumentation=mysqld##mysql参考手册Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=mul......
  • 解决“未能创建 SSL/TLS 安全通道”异常
    ServicePointManager.SecurityProtocol=SecurityProtocolType.Ssl3|SecurityProtocolType.Tls|SecurityProtocolType.Tls11|SecurityProtoco......
  • chatgpt帮我创建一个由go+mysql+jwt+gorm搭建的restapi
    好的,下面是一个简单的由go+mysql+jwt+gorm搭建的RESTAPI示例:首先,你需要创建一个新的Go模块。你可以使用如下命令来创建一个名为example的新模块:gomodinitexample接下来,你需要安装需要的依赖库,使用以下命令进行安装:gogetgithub.com/gorilla/muxgogetgithub.com/jinzhu......
  • 关于arcgis和postgresql数据库创建企业级地理数据库的配置文件
    第一:需要将arcgis的C:\ProgramFiles(x86)\GeoScene\Desktop\Desktop10.8\DatabaseSupport\PostgreSQL\12\Windows64这个路径下的文件拷贝到postgresql数据库的安装目录的lib文件夹中;第二:需要将五个文件libeay32.dll、libiconv-2.dll、libintl-8.dll、libpq.dll和ssleay32.d......
  • nim 创建 dll(nim学习系列)
    nim创建dll编译命令nimc--app:lib--nomain:ontest.nim“--app:lib”表示生成动态链接库(dll)。“--nomain:on”表示不生成dllmain函数。源代码test()是我们自定义的导出函数。importwinim/leanprocNimMain(){.cdecl,importc.}proctest():void{.cdecl,e......
  • 大模型训练数据统计+探索如何创建自己的数据集
    羊驼数据集52k,基于llama模型训练此数据集是是使用llama模型自己生成数据,然后对这些生成进行过滤,以删除低质量或类似的生成,并将生成的数据添加回任务池。这个过程可以重复多次,从而产生大量的教学数据,这些数据可以用来微调语言模型,以更有效地遵循指令。此创建数据集的方法其实和......
  • windows用户改名与创建管理员
    改名示例,结果失败:wmicuseraccountwherename='Administrator'rename'Admin'创建管理员账户#查看用户netuser#添加用户netusernamepassword/add#将用户设置为管理员netlocalgroupadministratorstian/add ......
  • idea进入和创建web项目
    我真的服了,以往一直Add添加项目,但是今天突然失败了我搞了好久都没搞出来,服了之后去问了我nb的舍友,他帮我搞好了!!!#记录,如何创建web项目第一步,创建项目在pom.xml文件里面使用web打包,并且转一下第二步,打开这个界面双击红色文字,点击ok第三步,点击上个图片上面的AddAppli......
  • 《花雕学AI》ChatMind:与AI对话,轻松梳理思路并创建思维导图
    引言:思维导图是一种有效的思维工具,可以帮助用户整理和表达自己的思路,提高学习和工作的效率和质量。然而,传统的思维导图工具往往需要用户花费大量的时间和精力,学习和操作复杂的界面和功能,而且很难根据用户的个性化需求,提供合适的样式和模板。有没有一种更简单、更智能、更有趣的思......