当前位置: 首页 > news >正文

西安网站建设联系电话做县城门户网站

西安网站建设联系电话,做县城门户网站,狼雨的seo教程,女性做网站很有名的Paddle 0-d Tensor 使用指南 1. 0-d Tensor 的定义 在深度学习框架中#xff0c;Tensor 是存储和操作数据的基本数据结构。一个 Tensor 可以有 0 到任意多的维度,每个维度对应一个 shape 值。而 0-d Tensor#xff0c;顾名思义#xff0c;就是一个无任何维度的 TensorTensor 是存储和操作数据的基本数据结构。一个 Tensor 可以有 0 到任意多的维度,每个维度对应一个 shape 值。而 0-d Tensor顾名思义就是一个无任何维度的 Tensor也被称为标量(scalar) Tensor。 从数学的角度来看0维 Tensor 可以看作是一个单个的数值,没有向量或矩阵等更高维度的结构。例如: import paddle# 创建0维Tensor scalar paddle.to_tensor(3.14) print(scalar, scalar.shape) # Tensor(shape[], dtypefloat32, placePlace(cpu), stop_gradientTrue, # 3.14000010) []可以看到这个 scalar 是一个单个的浮点数 3.14它的 shape 是一个空列表 []表示没有任何维度。0-d Tensor 其对应的是Numpy的 0-D array可以表示为 np.array(10.)其shape为 []维度为 0size为 1。 对比之下一维的 Tensor 则表示一个向量其对应的是 Numpy的 1-D array如果只有 1 个元素可以表示为 np.array([10.])其 shape 为 [1]维度为 1size为 1。下面我们来看一个一维 Tensor 的例子: vector paddle.to_tensor([1, 2, 3]) print(vector, vector.shape) # Tensor(shape[3], dtypeint64, placePlace(cpu), stop_gradientTrue, # [1, 2, 3]) [3]这里vector是一个一维张量,有3个元素,对应shape为[3]。 以上从数学角度上区分了 0-d Tensor 和 1-d Tensor在物理学中,标量和矢量是两个基本的物理量概念。标量只有一个数值没有方向; 而矢量除了数值外还附带一个确定的方向。 0-d Tensor对应着物理学中的标量概念。一个 0-d Tensor如 3.14、2.78 等仅仅表示一个单一的数值没有任何其他维度的信息。它可以表示一些简单的物理量,如温度、质量、电荷等。 而 1-d Tensor 则对应着矢量的概念。即使只有1个元素如 [5.0]它也不是一个纯标量而是一个有确定方向的向量。这个方向在物理意义上可能表示力、速度、电场强度等有方向性的物理量。 尽管在代码实现上0-d 和 1-d Tensor 可能没有太大的区别但它们对应的数学和物理概念是不同的。作为开发者,明确这种区别将有助于写出更加符合数学规范、更加符合物理意义的代码,从而减少逻辑错误和调试成本。 2. 0-d Tensor 滥用为 1-d Tensor 的危害 滥用 0d Tensor 来代替1维单元素Tensor(shape为[1]) 给使用体验带来一些负面影响主要体现在以下几个方面: 2.1 潜在的纬度错误 标量张量与仅含有一个元素的向量张量容易造成混淆它们的元素个数相同但在数学定义上完全不同。若将其形状表示为 shape[1]则无法区分标量和向量这与数学语义和行业通用的计算规则相悖可能导致模型出现意料之外的错误并增加开发调试成本。 由于 0-d 和 1-d Tensor 在数学上有着本质区别很多 API 在处理这两种情况时的行为也不尽相同。如果不加区分地混用,就可能导致 API 的行为出现异常。 import torchx torch.tensor(3.14) out torch.stack([x, x]) print(out.shape) # 输出 torch.Size([2]) 0D升为1D符合预期如果 Paddle 不支持 0-d Tensor就需要额外判断 x 是否为 1D然后补squeeze来矫正结果这造成了代码的冗余与可读性降低。写法如下 import paddlex paddle.to_tensor(3.14)# Paddle 写法需4行需要额外判断x是否为1D是就需要补squeeze来矫正结果以对齐 pytorch if len(x.shape) 1:# 因为用shape[1]的1维替代0维导致x[0]还是1维stack结果为2维出现异常升维需要补squeeze来校正维度out paddle.stack([x[0], x[0]]).squeeze() else:out paddle.stack([x[0], x[0]])如果 Paddle 支持 0-d Tensor就无需增加这些额外判断的代码代码可与其他深度学习框架例如Pytorch完全一致。写法如下 import paddlex paddle.to_tensor(3.14)out paddle.stack([x, x]) print(out.shape)由上可看出支持0-d Tensor后的Paddle代码在写法上简洁清晰很多提升了用户体验与API易用性。 2.2 代码可读性降低 正如上面的例子,为了区分0维和1维的情况,需要增加很多额外的判断和操作代码,使得代码的可读性和可维护性大幅降低。而遵循标准的数学语义,区分对待0维和1维,则可以写出更加简洁优雅的代码。 2.3 与第三方库集成困难 很多第三方库在实现时都会遵循标准的数学规范区分对待0维和1维Tensor。如果我们的代码中滥用0维作1维,就可能导致无法与这些库正常交互、集成它们的算子和模型。 比如在 Paddle 2.5 支持 0-d Tensor 之前EinOps一个用户量较大的爱因斯坦求和库计划支持 Paddle 后端为与其他框架MxNet、TF、Pytorch等保持统一结构需要使用 0-d Tensor然而发现 Paddle 有些 API 不支持 0维Tensor当前就只能暂停对 Paddle 的适配。 3. 应支持 0-d Tensor 的情况 3.1 逐元素计算类 对于所有的 elementwise 一元运算(如 tanh、relu 等)和二元运算 (如 add、sub、multiply 等)理应支持 0-d Tensor 作为输入或通过广播机制与高维Tensor进行计算。同时复合运算如 Linear(相当于matmuladd)也应支持 0维输入。 Paddle 已经支持了全部逐元素计算类的运算: import paddle# 一元运算 x paddle.to_tensor(3.14) y paddle.tanh(x) print(y) # 0.9953155994415283# 二元运算 x paddle.to_tensor(2.0) y paddle.to_tensor([1.0, 2.0, 3.0]) z x y # 0维可广播 print(z) # [3. 4. 5.]在这个例子中y 是 x 的 tanh 运算是一个标量因此适合用 0-d Tensor 来表示。z 是 x 和 y 的加法x 是一个标量y 是一个向量通过广播机制可以得到一个向量因此适合用 0-d Tensor 来表示。 3.2 升维和降维操作 诸如 unsqueeze、squeeze、reshape 等显式改变 Tensor 形状的 API都应当支持0维输入或输出。 Paddle 在这一块做得较好,下面是一些例子: # 升维 x paddle.to_tensor(3.14) y paddle.unsqueeze(x, 0) print(y.shape) # [1]# 降维 z paddle.squeeze(y) print(z.shape) # [] # 0维输出 w paddle.reshape(x, []) print(w.shape) # []当 x 是一个 0-d Tensor 时unsqueeze 可以将其升维为 1-d Tensorsqueeze 可以将其降维为 0-d Tensorreshape 可以将其形状改变为 []。 3.3 Tensor 创建相关 能够直接创建 0维Tensor 的 API 是很有必要的它们包括: 不指定 shape 时如 to_tensor 将标量转为 0维显式指定 shape[]拷贝已有 Tensor 时维度信息应保持不变 Paddle 在这一部分的支持也是比较全面的: # Python标量 - 0维Tensor scalar paddle.to_tensor(3.14) print(scalar) # Tensor(shape[], dtypefloat32, placePlace(cpu), stop_gradientTrue, # 3.14000010)# 指定shape [] zeros paddle.zeros([]) ones paddle.ones([], dtypeint32) print(zeros) # Tensor(shape[], dtypefloat32, placePlace(cpu), stop_gradientTrue, 0.) print(ones) # Tensor(shape[], dtypeint32, placePlace(cpu), stop_gradientTrue, 1)# 保持原shape t paddle.to_tensor([1.0, 2.0]) scalar t[0] # 0维输出 copy paddle.assign(scalar) # 0维拷贝 print(scalar) # Tensor(shape[], dtypefloat32, placePlace(cpu), stop_gradientTrue, 1.)3.4 轴向归约运算 当对 Tensor 进行诸如 sum、mean、max 等的归约操作时如果指定了 axisNone就应当有0维输出的可能。Paddle 已经支持了这种情况: # axisNone归约所有维度可0维输出 x paddle.rand([2, 3]) y paddle.sum(x, axisNone) # 0维输出 print(y.shape) # []对 x 进行 sum 操作axisNone 表示对所有维度进行归约输出是一个标量因此适合用 0-d Tensor 来表示。 3.5 索引切片操作 在使用索引切片的时候应当支持输入和输出是 0-d Tensor 的情况。 索引输入0D时使用标量作为索引的时候输入0-D时应该与int标量索引的效果一致具有降维效果以下是一个例子: import paddlex paddle.rand([2, 2, 2]) y x[paddle.to_tensor(0)] print(y) # Tensor(shape[2, 2], dtypefloat32, placePlace(cpu), stop_gradientTrue, # [[0.97571695, 0.84757918], # [0.35047710, 0.37460467]])索引输出0D时当索引的输出应当支持 0-d Tensor 时例如3-D Tensor取 [000]降3维应输出 0D以下是一个例子: x paddle.rand([2, 2, 2]) y x[0, 0, 0]print(y) Tensor(shape[], dtypefloat32, placePlace(cpu), stop_gradientTrue,0.07096851)同理gather、scatter等类似功能API应具有相同效果下面的例子展示了gather的 0维 输入和输出 x paddle.to_tensor([0, 1, 2, 3]) index paddle.to_tensor(0) # index 是 0-d Tensor y paddle.gather(x, index) # 输出是 0-d Tensor print(y) # Tensor(shape[], dtypeint64, placePlace(cpu), stop_gradientTrue, # 0)3.6 标量属性输入 有些Op的属性语义上应该是标量值,如 shape、start/end、step 等,这种情况下应当支持 0-d Tensor 作为输入。 # paddle.linspace的start/end/step都支持0维输入 start paddle.to_tensor(1.0) end paddle.to_tensor(5.0) values paddle.linspace(start, end, 5) print(values) # [1. 2. 3. 4. 5.]在这个例子中start 和 end 都是标量适合用 0-d Tensor 来表示。linspace 的输出是一个向量但是 start 和 end 是标量因此适合用 0-d Tensor 来表示。 3.7 标量输出语义 有些计算的输出在语义上应该是个标量值,如向量点积、秩、范数、元素个数等,这种情况下应返回 0维Tensor。下面是一些例子: # 点积输出0维Tensor x paddle.rand([5]) y paddle.rand([5]) z paddle.dot(x, y) print(z.shape) # []# 范数输出0维 norm paddle.norm(x, p2) print(norm.shape) # []上面的例子中z 是 x 和 y 的点积是一个标量因此适合用 0-d Tensor 来表示。同理norm 是 x 的二范数也是一个标量适合用 0-d Tensor 来表示。 3.8 自动求导 在深度学习中,自动微分是一个非常核心的特性,支持标量对标量(0维对0维)的求导是很有必要的。 import paddle# 标量对标量导数 x paddle.to_tensor(3.0, stop_gradientFalse) y x**2 y.backward() print(x.grad) # 6.0上面的例子中x 是一个 0-d Tensory 是 x 的平方y.backward() 可以计算出 y 对 x 的导数结果是 6.0。这种标量对标量的求导是深度学习中很常见的操作因此支持 0-d Tensor 的自动求导是很有必要的。 3.9 损失函数输出 深度学习模型的损失函数输出通常是一个标量值用以指示整个小批次的损失大小这适合用 0维Tensor 来表示。 import paddle.nn.functional as Flogits paddle.rand([4, 10]) # 假设是分类模型的输出логит labels paddle.randint(0, 10, [4]) # 对应的类别标签loss F.cross_entropy(logits, labels) print(loss.shape) # []在这个例子中loss 是一个标量用以表示整个小批次的交叉熵损失因此适合用 0-d Tensor 来表示。 4. 总结 在深度学习框架中,0维Tensor虽然形式简单,但具有重要的概念意义和实际应用价值。它不仅对应数学和物理上的标量概念,也是各种标量计算和控制流程的基础表示形式。 支持 0-d Tensor的使用,可以让框架更加贴合数学规范,让代码更加简洁优雅。同时,它也是实现很多实用功能的基石。框架要避免在处理0维和1维Tensor时产生行为分歧尽量与其他主流框架保持一致方便模型和算子在不同框架间的移植。当下 Paddle 框架中已经全面支持 0-D Tensor并实际上已成为后续新增算子的开发规范让用户能够方便地使用 0-d Tensor。 参考文献 https://github.com/PaddlePaddle/community/blob/master/pfcc/paddle-code-reading/ZeroDim/judge_zero_dim.mdhttps://github.com/PaddlePaddle/community/blob/master/pfcc/paddle-code-reading/ZeroDim/zero_dim_concept.mdhttps://github.com/PaddlePaddle/community/blob/master/pfcc/paddle-code-reading/ZeroDim/all_zero_dim_api.md
http://www.hkea.cn/news/14542982/

相关文章:

  • 哪里培训做网站找做废薄膜网站
  • 淄博微网站开发淘宝客建立网站
  • net网站开发实例wordpress tinymce advanced
  • 网页设计网站架构图片免费素材网
  • 综合门户网站建设方案用c语言做公司网站
  • 建设门户公司网站wordpress百度熊掌
  • 茶叶怎么做网站销售wordpress 接入小程序
  • c++网站开发网站内链建设不可忽视的地方
  • 国企网站建设报告贵州建设水利厅考试网站
  • 三门峡河南网站建设玉溪网站网站建设
  • 牛视频网站建设南通seo网站优化软件
  • 气象网站建设的自查报告南宁网站忧化
  • 网站建设完成后交付方式wordpress英文升级为中文版
  • 新兴县城乡建设局网站登录网站建设流程所用工具
  • 什么网站动物和人做的长春seo网站管理
  • 流量查询中国移动官方网站做搬家广告哪家网站有优
  • 广州做手机网站建设企业网站免费推广软件
  • 外贸网站建设公司平台如何开发一个小程序
  • 网站建设首选唯美谷网站开发中心
  • 公司网站制作要多少钱wordpress设置主页面
  • 模版建网站湛江师范学院网站开发技术
  • 工作一般做网站视频的工作叫做什么沧州市注册网络公司
  • 网站服务器问题优秀交互设计网站
  • 网站发布服务托管器开了个网站用年份做名字好吗
  • 江苏省建设厅 标准化网站跨国浏览器
  • 平顶山网站建设费用什么是跨境电商主要做什么
  • 怎么把自己做的网站中国货源网一件代发
  • 建站申请版面设计
  • 网站里做任务沈阳模板网站制作
  • 校园网站设计与实现长春网站开发培训