2301_76263838 2023-03-26 11:34 采纳率: 100%
浏览 10
已结题

a[k][i][j] = b[k][m][n] 和 a[k][i,j] = b[k][m][n]两种赋值方式异同

我在编写池化层代码时,对比了使用a[k][i][j] = b[k][m][n] 和 a[k][i,j] = b[k][m][n]两种赋值方式。我发现,使用测试代码时,其结果是一样的。
(测试发现是否去除.copy()对结果没有影响)

img

以下是测试用例,输出结果正常

img

然而,实际使用时发现,a[k][i][j] = b[k][m][n]的形式赋值会异常(IndexError: index 1 is out of bounds for axis 0 with size 1),而使用a[k][i,j] = b[k][m][n]则正常。可以确保a和b本身的形状是匹配的(a.shape=12,8,8;b.shape=12,4,4),而且打印出来发现a[k][i,j],a[k][i][j],b[k][m][n]都是一个浮点数。

请问这是怎么回事?

img

  • 写回答

1条回答 默认 最新

  • H3T 2023-03-26 13:20
    关注

    根据测试用例,可以看出 Maxpooling 类的 forward 和 backward 方法都是需要使用 a[k][i][j] 和 b[k][m][n] 的形式进行赋值的。因此,使用 a[k][i,j] = b[k][m][n] 的赋值方式会导致错误。
    出现这种错误的原因可能是因为在 Maxpooling 类的 forward 和 backward 方法中,a 和 b 的数据类型是 numpy.ndarray,而 a[k][i,j] 这种形式的赋值方式其实是在调用 numpy.ndarray 的 getitem 方法,返回的是一个包含单个元素的 numpy.ndarray,而不是一个浮点数。因此,在使用 a[k][i,j] = b[k][m][n] 进行赋值时,左边的 a[k][i,j] 实际上是一个形状为 (1,) 的 numpy.ndarray,而右边的 b[k][m][n] 是一个浮点数,导致了赋值失败。
    相比之下,使用 a[k][i][j] = b[k][m][n] 的赋值方式可以直接将右边的浮点数赋值给左边的元素,避免了上述问题。
    因此,建议在 Maxpooling 类的 forward 和 backward 方法中使用 a[k][i][j] = b[k][m][n] 的赋值方式。
     
    如果答案对您有所帮助,望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 3月26日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题