Bug解决-RuntimeError: Sizes of tensors must match except in dimension 2. Got 320 and 160 (The offendin

Bug:

RuntimeError: Sizes of tensors must match except in dimension 2. Got 320 and 160 (The offending index is 0)

解决方法:

1.获取Tensor大小

获取 tensor 的方法有两种:shape 和 size(),其中shape是其属性,而 size() 是其继承的方法,两者均可以获得 tensor 的维度。 shape 是属性,使用中括号,size() 是函数,使用小括号

import torch

a = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(a.shape)
print(a.size())

另外,还可以获取其中的某一维度

print(a.shape[0])
print(a.shape[1])
print(a.size(0))
print(a.size(1))

2.了解torch.cat的使用方法

torch.cat是将两个张量(tensor)拼接在一起,cat是concatnate的意思,即拼接,联系在一起。

C = torch.cat( (A,B),0 )  #按维数0拼接(竖着拼)
 
C = torch.cat( (A,B),1 )  #按维数1拼接(横着拼)
 import torch
>>> A=torch.ones(2,3)    #2x3的张量(矩阵)                                     
>>> A
tensor([[ 1.,  1.,  1.],
        [ 1.,  1.,  1.]])
>>> B=2*torch.ones(4,3)  #4x3的张量(矩阵)                                    
>>> B
tensor([[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]])
>>> C=torch.cat((A,B),0)  #按维数0(行)拼接
>>> C
tensor([[ 1.,  1.,  1.],
         [ 1.,  1.,  1.],
         [ 2.,  2.,  2.],
         [ 2.,  2.,  2.],
         [ 2.,  2.,  2.],
         [ 2.,  2.,  2.]])
>>> C.size()
torch.Size([6, 3])
>>> D=2*torch.ones(2,4) #2x4的张量(矩阵)
>>> C=torch.cat((A,D),1)#按维数1(列)拼接
>>> C
tensor([[ 1.,  1.,  1.,  2.,  2.,  2.,  2.],
        [ 1.,  1.,  1.,  2.,  2.,  2.,  2.]])
>>> C.size()
torch.Size([2, 7])

上面给出了两个张量A和B,分别是2行3列,4行3列。即他们都是2维张量。因为只有两维,这样在用torch.cat拼接的时候就有两种拼接方式:按行拼接和按列拼接。即所谓的维数0和维数1. 

C=torch.cat((A,B),0)就表示按维数0(行)拼接A和B,也就是竖着拼接,A上B下。此时需要注意:列数必须一致,即维数1数值要相同,这里都是3列,方能列对齐。拼接后的C的第0维是两个维数0数值和,即2+4=6.

C=torch.cat((A,B),1)就表示按维数1(列)拼接A和B,也就是横着拼接,A左B右。此时需要注意:行数必须一致,即维数0数值要相同,这里都是2行,方能行对齐。拼接后的C的第1维是两个维数1数值和,即3+4=7.

从2维例子可以看出,使用torch.cat((A,B),dim)时,除拼接维数dim数值可不同外其余维数数值需相同,方能对齐

实例:在深度学习处理图像时,常用的有3通道的RGB彩色图像及单通道的灰度图。张量size为cxhxw,即通道数x图像高度x图像宽度。在用torch.cat拼接两张图像时一般要求图像大小一致而通道数可不一致,即h和w同,c可不同。当然实际有3种拼接方式,另两种好像不常见。比如经典网络结构:U-Net. 里面用到4次torch.cat,其中copy and crop操作就是通过torch.cat来实现的。可以看到通过上采样(up-conv 2x2)将原始图像h和w变为原来2倍,再和左边直接copy过来的同样h,w的图像拼接。这样做,可以有效利用原始结构信息。

参考链接:Pytorch中的torch.cat()函数_荷叶田田_的博客-CSDN博客_python torch.cat

3.使用PixelShuffle上采样图像

 

 上图中左侧第一部分是用于对图像的特征进行抽取。而后在倒数第二层生成 r*r 个通道特征图,这里 r 就是希望上采样的倍数pixelshuffle的主要功能就是将这 r*r 个通道的特征图组合为新的 w∗r,h∗r 的上采样结果。具体来说,就是将原来一个低分辨的像素划分为rr个更小的格子,利用rr个特征图对应位置的值按照一定的规则来填充这些小格子。按照同样的规则将每个低分辨像素划分出的小格子填满就完成了重组过程。在这一过程中模型可以调整 r*r 个shuffle通道权重 不断优化生成的结果。主要实现了这样的功能:N * (C * r * r) * W * H ——>> N * C * (H * r) * (W * r)

代码实现:

import torch

a = torch.arange(36).reshape([1, 4, 3, 3])
b = torch.pixel_shuffle(a, 2)
print(a.shape) #torch.Size([1, 4, 3, 3])
print(b.shape) #torch.Size([1, 1, 6, 6])

出现Bug:

RuntimeError: c % upscale_factor_squared == 0 INTERNAL ASSERT FAILED at "/opt/conda/conda-bld/pytorch_1607370117127/work/aten/src/ATen/native/PixelShuffle.cpp":24, please report a bug to PyTorch. pixel_shuffle expects input channel to be divisible by square of upscale_factor, but got input with sizes [4, 2, 160, 160], upscale_factor=2, and self.size(1)=2 is not divisible by 4

解决方法:使用

m=nn.Upsample(scale_factor=2)

4.尺度一致后 torch.cat不会报错

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值