热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

paddle复现pytorch踩坑(四):Tensor

paddlepaddle从1.5版本以上采用动态图的思想,本博客基于1.8.0以上版本。关于Tensor的用法:pytorch可以使用静态数组索引&#

paddlepaddle从1.5版本以上采用动态图的思想,本博客基于1.8.0以上版本。
关于Tensor的用法:


  • pytorch可以使用静态数组索引;可以使用tensor索引
  • paddlepaddle可以使用静态数组索引;不可以使用tensor索引

示例1:索引示例

# pytorch code
aa = cls[active, :]
# paddlepaddle code
aa = cls[active, :]

报错:

SystemError: <built-in method __getitem__ of PyCapsule object at 0x0000023217C75F90> returned a result with an error set

  • 其中
    activate &#61; tensor [1,… 0, 1…0]
    clc &#61; tenor.shape [300, 4]
  • 原因&#xff1a;在pytorch里可以这样写&#xff0c;但是在paddle里不行
  • 改为&#xff1a;利用nonzero 和 gather函数

# paddlepaddle code
index &#61; fluid.layers.nonzero(active)
aa &#61; fluid.layers.gather(cls, index)

测试全代码

import paddle.fluid as fluid
from paddle.fluid.dygraph.base import to_variable
import numpy as npdata &#61; np.ones([300, 4]).astype(&#39;float32&#39;)
index &#61; np.zeros([300]).astype(&#39;int&#39;)
index[0] &#61; 1
index[2] &#61; 1
index[10] &#61; 1with fluid.dygraph.guard():data &#61; to_variable(data)index &#61; to_variable(index)index &#61; fluid.layers.nonzero(index)data &#61; fluid.layers.gather(data, index)# data &#61; data[index, :]print(data.shape)

示例2

# pytorch code
active &#61; labels_weight > 0
y &#61; bbox_x[active]# paddlepaddle code
active &#61; labels_weight > 0
index &#61; fluid.layers.nonzero(active)
y &#61; fluid.layers.concat([fluid.layers.reshape(fluid.layers.gather(bbox_x[i, :], index[i, :]), [1, -1]) for i in range(index.shape[0])], axis&#61;0)

示例3

# pytorch code
loss_bbox_y &#61; fluid.layers.mean(loss_bbox_y * bbox_weights[active])# paddlepaddle code
loss_bbox_y &#61; fluid.layers.mean(fluid.layers.cast(loss_bbox_y, &#39;float64&#39;)* fluid.layers.concat([fluid.layers.reshape(fluid.layers.gather(bbox_weights[i, :], index[i, :]), [1, -1]) for i in range(index.shape[0])], axis&#61;0))

示例4

# pytorch code
bbox_x3d_dn_fg &#61; bbox_x3d_dn[bind, fg_inds]# paddlepaddle code
bbox_x3d_dn_fg &#61; fluid.layers.gather(bbox_x3d_dn[bind], fluid.dygraph.to_variable(fg_inds))

示例5&#xff1a;不能维度直接赋值

报错&#xff1a;

TypeError: &#39;paddle.fluid.core_avx.VarBase&#39; object does not support item assignment

# pytorch code
Pred_boxes[:, 0] &#61; pred_ctr_x - 0.5 * pred_w
pred_boxes[:, 1] &#61; pred_ctr_y - 0.5 * pred_h
pred_boxes[:, 2] &#61; pred_ctr_x &#43; 0.5 * pred_w
pred_boxes[:, 3] &#61; pred_ctr_y &#43; 0.5 * pred_h# paddlepaddle code
pred_boxes &#61; fluid.layers.concat([pred_ctr_x - 0.5 * pred_w,pred_ctr_y - 0.5 * pred_h,pred_ctr_x &#43; 0.5 * pred_w,pred_ctr_y &#43; 0.5 * pred_h
])

示例6&#xff1a;维度报错

报错&#xff1a;

too many indices (3) for tensor of dimension 2

# pytorch code
bbox_x[bind, :, np.newaxis ]
# paddlepaddle code
fluid.layers.reshape(bbox_x[bind, :], [1, -1, 1])

示例7&#xff1a;tensor的值不能直接利用

报错&#xff1a;paddlepaddle中的value不能直接拿出来用。

TypeError: The type of &#39;shape&#39; in reshape must be list[int] or tuple(int) in Dygraph mode, but received <class &#39;list&#39;>, which contains Variable.

错误代码&#xff1a;其中stack_size, feat_size 为 tensor。

# paddlepaddle code
shift_x1 &#61; fluid.layers.reshape(fluid.dygraph.to_variable(shift_x1), [1, stack_size, feat_size[1]])

改进加入

# paddlepaddle code
stack_size &#61; stack_size.numpy()
feat_size &#61; feat_size.numpy()

Tensor数据类型判断

# pytorch code
if data_type &#61;&#61; torch.tensor:# paddlepaddle code
if data_type &#61;&#61; fluid.core_avx.VarBase:

其他用法

# pytorch code
b &#61; q_lt[..., :N]# paddlepaddle code
b &#61; q_lt[:, :, :, :N]

需要注意pytorch中.contiguous方法

.contiguous()方法&#xff0c;使tensor的元素在内存空间中连续
通常

tensor.contiguous().view()
&#61;&#61;
tensor.reshape()

推荐阅读
  • 本教程旨在指导开发者如何在Android应用中通过ViewPager组件实现图片轮播功能,适用于初学者和有一定经验的开发者,帮助提升应用的视觉吸引力。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
  • 本文详细介绍了Spring AOP注解的基本概念及其实现方式,并通过实例演示了如何在项目中使用这些注解进行面向切面的编程。旨在帮助开发者更好地理解和运用Spring AOP功能。 ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 本文介绍了一个将 Java 实体对象转换为 Map 的工具类,通过反射机制获取实体类的字段并将其值映射到 Map 中,适用于需要将对象数据结构化处理的场景。 ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
  • Python Selenium WebDriver 浏览器驱动详解与实践
    本文详细介绍了如何使用Python结合Selenium和unittest构建自动化测试框架,重点解析了WebDriver浏览器驱动的配置与使用方法,涵盖Chrome、Firefox、IE/Edge等主流浏览器。 ... [详细]
  • 探讨如何在给定数组中寻找一个连续子数组,使其和至少达到指定值s,同时确保子数组长度最短。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
author-avatar
syjs10
这个家伙很懒
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有