关于pytorch相关部分矩阵变换函数的问题分析

 更新时间:2022年03月21日 11:05:47   作者:m0_67403240  
这篇文章主要介绍了pytorch相关部分矩阵变换函数,包括tensor维度顺序变换BCHW顺序的调整,矩阵乘法相关函数,矩阵乘,点乘,求取矩阵对角线元素或非对角线元素的问题,本文给大家介绍的非常详细,需要的朋友可以参考下

1、tensor 维度顺序变换 BCHW顺序的调整

tensor.permute(dims)

将tensor的维度换位。参数是一系列的整数,代表原来张量的维度。比如三维就有0,1,2这些dimension。

import torch
a = torch.rand(8,256,256,3)   #---> n,h,w,c
print(a.shape)
b = a.permute(0,3,1,2)  # ---> n,c,h,w
print(b.shape)
#输出
torch.Size([8, 256, 256, 3])
torch.Size([8, 3, 256, 256])

numpy内进行维度顺序变换采用_numy.transpose(a,axis=None)_

参数 a: 输入数组

axis: int类型的列表,这个参数是可选的。默认情况下,反转的输入数组的维度,当给定这个参数时,按照这个参数所定的值进行数组变换。

返回值 p: ndarray 返回转置过后的原数组的视图。

import numpy as ?np
?
x = np.random.randn(8,256,256,3) ?# ---> n,h,w,c
print(x.shape)
y=x.transpose((0,3,1,2)) ? # ?----> n,c,h,w
print(y.shape)

#输出
(8, 256, 256, 3)
(8, 3, 256, 256)

2、矩阵乘法相关函数,矩阵乘,点乘

二维矩阵乘法torch.mm()

torch.mm(mat1,mat2,out=None),其中mat1(NXM),mat2(MXD),输出out的维度为(NXD)

该函数一般只用来计算两个二维矩阵的矩阵乘法,并且不支持broadcast操作。

三维带batch的矩阵乘法 torch.bmm()
由于神经网络训练一般采用mini-batch,经常输入的时三维带batch的矩阵,所以提供torch.bmm(bmat1, bmat2, out=None),其中bmat1(b×n×mb×n×m),bmat2(b×m×db×m×d),输出out的维度是(b×n×db×n×d)。

该函数的两个输入必须是三维矩阵且第一维相同(表示Batch维度),不支持broadcast操作。

多维矩阵乘法 torch.matmul()
torch.matmul(input, other, out=None)支持broadcast操作,使用起来比较复杂。

针对多维数据 matmul()乘法,我们可以认为该matmul()乘法使用使用两个参数的后两个维度来计算,其他的维度都可以认为是batch维度。假设两个输入的维度分别是input(1000×500×99×111000×500×99×11), other(500×11×99500×11×99)那么我们可以认为torch.matmul(input, other, out=None)乘法首先是进行后两位矩阵乘法得到(99×11)×(11×99)(99×99)(99×11)×(11×99)(99×99) ,然后分析两个参数的batch size分别是 (1000×500)(1000×500) 和 500500 , 可以广播成为 (1000×500)(1000×500), 因此最终输出的维度是(1000×500×99×991000×500×99×99)。

矩阵逐元素(Element-wise)乘法 torch.mul()
torch.mul(mat1, other, out=None),其中other乘数可以是标量,也可以是任意维度的矩阵,只要满足最终相乘是可以broadcast的即可

@ :矩阵乘法,自动执行适合的矩阵乘法函数
* :element-wise乘法

3、求取矩阵对角线元素,或非对角线元素

取对角线元素可以用torch.diagonal()

x = torch.randn(4,4)
# tensor([[ 0.9148,  0.1396, -0.8974,  2.0014],
#        [ 0.1129, -0.3656,  0.4371,  0.2618],
#        [ 1.1049, -0.0774, -0.4160, -0.4922],
#        [ 1.3197, -0.2022, -0.0031, -1.3811]])

torch.diagonal(x)
# tensor([ 0.9148, -0.3656, -0.4160, -1.3811])

非对角线元素没有特定API,如果是求和,可以矩阵求和 减去对角线元素和 。

网上看到一个巧妙的非对角线元素方法

n, m = x.shape
assert n == m
x.flatten()[:-1].view(n-1,n+1)[:,1:].flatten()
# tensor([ 0.1396, -0.8974,  2.0014,  0.1129,  0.4371,  0.2618,  1.1049, -0.0774,
#        -0.4922,  1.3197, -0.2022, -0.0031])

首先利用flatten()拉直向量,然后去掉最后一个元素,得到n^2 - 1个元素,然后构造为一个维度为[N-1, N+1]的矩阵。在这个矩阵中,之前所有的对角线元素全部出现在第1列,然后根据索引获取[:, 1:]元素,得到的就是原矩阵的非对角线元素。

在这里插入图片描述

到此这篇关于pytorch相关部分矩阵变换函数的文章就介绍到这了,更多相关pytorch矩阵变换函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java在linux本地执行shell命令的实现方法

    java在linux本地执行shell命令的实现方法

    本文主要介绍了java在linux本地执行shell命令的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • SpringBoot访问请求404解决方法

    SpringBoot访问请求404解决方法

    这篇文章主要介绍了SpringBoot访问请求404解决方法,文中有详细的解决方法供大家参考,对我们学习或工作有一定的帮助,需要的朋友跟着小编一起来学习吧
    2023-07-07
  • WeakHashMap的垃圾回收原理详解

    WeakHashMap的垃圾回收原理详解

    这篇文章主要介绍了WeakHashMap的垃圾回收原理详解,WeakHashMap 与 HashMap 的用法基本类似,与 HashMap 的区别在于,HashMap的key保留了对实际对象的强引用个,这意味着只要该HashMap对象不被销毁,该HashMap的所有key所引用的对象就不会被垃圾回收,需要的朋友可以参考下
    2023-09-09
  • SpringBoot集成geodesy实现距离计算功能

    SpringBoot集成geodesy实现距离计算功能

    Geodesy:大地测量学的神奇力量 Geodesy,又称大地测量学,是一门研究地球形状、大小及其重力场的学科,在地球距离计算中,它扮演着至关重要的角色,故本文给大家介绍了SpringBoot集成geodesy实现距离计算功能,感兴趣的朋友可以参考下
    2024-06-06
  • java并发编程之进程和线程调度基础详解

    java并发编程之进程和线程调度基础详解

    这篇文章主要介绍了java并发编程之进程和线程调度基础,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • SpringBoot起步依赖和自动配置基本介绍

    SpringBoot起步依赖和自动配置基本介绍

    这篇文章主要介绍了SpringBoot起步依赖和自动配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • springboot整合vue项目(小试牛刀)

    springboot整合vue项目(小试牛刀)

    这篇文章主要介绍了springboot整合vue项目(小试牛刀),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • springMVC导出word模板的方法

    springMVC导出word模板的方法

    这篇文章主要为大家详细介绍了springMVC导出word模板的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • springboot学习笔记之 profile多环境配置切换的实现方式

    springboot学习笔记之 profile多环境配置切换的实现方式

    这篇文章主要介绍了springboot profile多环境配置切换的实现方式,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • Java集合功能与用法实例详解

    Java集合功能与用法实例详解

    这篇文章主要介绍了Java集合功能与用法,结合实例形式详细分析了java集合的基本概念、功能、原理、操作技巧与使用注意事项,需要的朋友可以参考下
    2020-04-04

最新评论