PyTorch 两大转置函数 transpose() 和 permute(), 以及RuntimeError: invalid argument 2: view size is not compati

关心差别的可以直接看[3.不同点]和[4.连续性问题]

前言

pytorch中转置用的函数就只有这两个

  1. transpose()
  2. permute()

注意只有transpose()有后缀格式:transpose_():后缀函数的作用是简化如下代码:

x = x.transpose(0,1)
等价于
x.transpose_()
# 相当于x = x + 1 简化为 x+=1

这两个函数功能相同,有一些在内存占用上的细微区别,但是不影响编程、可以忽略

1. 官方文档
transpose()
torch.transpose(input, dim0, dim1, out=None) → Tensor

函数返回输入矩阵input的转置。交换维度dim0dim1

参数:

  • input (Tensor) – 输入张量,必填
  • dim0 (int) – 转置的第一维,默认0,可选
  • dim1 (int) – 转置的第二维,默认1,可选
permute()
permute(dims) → Tensor

将tensor的维度换位。

参数:

  • dims (int…*)-换位顺序,必填
2. 相同点
  1. 都是返回转置后矩阵。
  2. 都可以操作高纬矩阵,permute在高维的功能性更强。
3.不同点

先定义我们后面用的数据如下

# 创造二维数据x,dim=0时候2,dim=1时候3
x = torch.randn(2,3)       'x.shape  →  [2,3]'
# 创造三维数据y,dim=0时候2,dim=1时候3,dim=2时候4
y = torch.randn(2,3,4)   'y.shape  →  [2,3,4]'
  1. 合法性不同

torch.transpose(x)合法, x.transpose()合法。
tensor.permute(x)合法,x.permute()合法。

参考第二点的举例

  1. 操作dim不同:

transpose()只能一次操作两个维度;permute()可以一次操作多维数据,且必须传入所有维度数,因为permute()的参数是int*

举例

# 对于transpose
x.transpose(0,1)     'shape→[3,2] '  
x.transpose(1,0)     'shape→[3,2] '  
y.transpose(0,1)     'shape→[3,2,4]' 
y.transpose(0,2,1)  'error,操作不了多维'

# 对于permute()
x.permute(0,1)     'shape→[2,3]'
x.permute(1,0)     'shape→[3,2], 注意返回的shape不同于x.transpose(1,0) '
y.permute(0,1)     "error 没有传入所有维度数"
y.permute(1,0,2)  'shape→[3,2,4]'
  1. transpose()中的dim没有数的大小区分;permute()中的dim有数的大小区分

举例,注意后面的shape

# 对于transpose,不区分dim大小
x1 = x.transpose(0,1)   'shape→[3,2] '  
x2 = x.transpose(1,0)   '也变换了,shape→[3,2] '  
print(torch.equal(x1,x2))
' True ,value和shape都一样'

# 对于permute()
x1 = x.permute(0,1)     '不同transpose,shape→[2,3] '  
x2 = x.permute(1,0)     'shape→[3,2] '  
print(torch.equal(x1,x2))
'False,和transpose不同'

y1 = y.permute(0,1,2)     '保持不变,shape→[2,3,4] '  
y2 = y.permute(1,0,2)     'shape→[3,2,4] '  
y3 = y.permute(1,2,0)     'shape→[3,4,2] '  
4.关于连续contiguous()

经常有人用view()函数改变通过转置后的数据结构,导致报错
RuntimeError: invalid argument 2: view size is not compatible with input tensor's....

这是因为tensor经过转置后数据的内存地址不连续导致的,也就是tensor . is_contiguous()==False
这时候reshape()可以改变该tensor结构,但是view()不可以,具体不同可以看view和reshape的区别
例子如下:

x = torch.rand(3,4)
x = x.transpose(0,1)
print(x.is_contiguous()) # 是否连续
'False'
# 再view会发现报错
x.view(3,4)
'''报错
RuntimeError: invalid argument 2: view size is not compatible with input tensor's....
'''

# 但是下面这样是不会报错。
x = x.contiguous()
x.view(3,4)

我们再看看reshape()

x = torch.rand(3,4)
x = x.permute(1,0) # 等价x = x.transpose(0,1)
x.reshape(3,4)
'''这就不报错了
说明x.reshape(3,4) 这个操作
等于x = x.contiguous().view()
尽管如此,但是torch文档中还是不推荐使用reshape
理由是除非为了获取完全不同但是数据相同的克隆体
'''

调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一毛一样。
(这一段看文字你肯定不理解,你也可以不用理解,有空我会画图补上)

只需要记住了,每次在使用view()之前,该tensor只要使用了transpose()permute()这两个函数一定要contiguous().

5.总结

最重要的区别应该是上面的第三点和第四个。

另外,简单的数据用transpose()就可以了,但是个人觉得不够直观,指向性弱了点;复杂维度的可以用permute(),对于维度的改变,一般更加精准。

### 回答1: 运行时错误:CUDA错误:无效的配置参数。 这个错误通常是由于CUDA程序中的某些参数配置不正确引起的。可能需要检查代码中的参数设置,确保它们符合CUDA的要求。另外,也可能需要检查CUDA驱动程序和CUDA工具包的版本是否匹配。 ### 回答2: runtimeerror: cuda error: invalid configuration argument通常是由于使用了无效的 CUDA 配置参数造成的。这个错误通常发生在使用 PyTorch 或其他深度学习框架进行模型训练时。 常见的原因包括: 1. 矩阵维度不匹配。深度学习模型需要输入一个批次的数据进行训练,如果输入的数据维度不正确,就会出现这个错误。解决方法是检查输入数据的维度是否与模型定义相匹配。 2. CUDA 情况错误。这种情况下,可能是因为您的设备没有正确安装 CUDA 驱动程序或者内存不足。解决方法是检查设备的 CUDA 版本是否正确,并且确保您的设备上有足够的内存。 3. 使用无效的 GPU 参数。在使用深度学习框架训练模型时,需要指定 GPU 的一些参数,例如 GPU 数量、线程块大小等。如果这些参数不正确,就会出现这个错误。解决方法是检查参数设置是否正确。 4. 使用不支持的操作。有些操作在 CUDA 上不受支持,例如非法的内存读写、使用未初始化的指针等。这些操作可能会导致程序崩溃并出现这个错误。解决方法是检查代码中是否存在这些操作,并进行相应的修改。 5. 程序编译错误。有时在编译深度学习程序时会出现错误,例如编译器无法识别某些指令或者编译的代码无法在 CUDA 上运行。这些问题可能会导致程序崩溃并显示这个错误。解决方法是检查程序编译过程中是否出现错误,并进行相应的修改。 总之,runtimeerror: cuda error: invalid configuration argument 的原因可能有很多,需要根据具体情况进行诊断和解决。在解决问题之前,需要仔细检查代码并了解 CUDA 的基本原理,以便更好地调试问题。 ### 回答3: 运行时错误:CUDA错误:无效的配置参数 这个错误通常出现在使用CUDA编写并运行GPU加速的代码时。原因是CUDA配置参数无效。CUDA配置参数可以理解为GPU设备使用的一些设置,如线程块大小、线程块数量、共享内存大小等等。这些设置往往是由程序员手动设置的,因此如果设置不当就会导致无效的配置参数错误。 解决这个问题的方法有很多种,以下是一些常见的方法: 1.确认CUDA环境是否正确:检查CUDA的安装是否正确并且与代码版本兼容。如果CUDA版本不匹配,则很可能会出现无效的配置参数错误。 2.检查CUDA线程块、线程和共享内存大小设置:如果程序中使用了CUDA内核函数,则需要检查CUDA线程块、线程和共享内存大小设置是否正确。确保设置的大小不超过GPU设备的最大限制,否则会出现无效的配置参数错误。 3.检查CUDA设备数量和ID设置:如果程序中使用了多个CUDA设备,则需要检查设备数量和ID设置是否正确。确保程序在正确的GPU设备上执行,否则会出现无效的配置参数错误。 4.检查CUDA内存使用:如果程序中使用了大量的GPU内存资源,则需要检查内存使用是否正确。如果内存使用不当,也可能会导致无效的配置参数错误。 总之,要解决CUDA错误:无效的配置参数问题,需要仔细检查CUDA环境、线程、设备和内存等设置,确保设置正确、合理,以保证程序正常运行。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值