Python 如何将变换应用于火炬张量

Python 如何将变换应用于火炬张量,python,pytorch,transform,interpolation,torchvision,Python,Pytorch,Transform,Interpolation,Torchvision,我有一个火炬张量z,我想将变换矩阵mat应用于z,并使输出与z的大小完全相同。以下是我正在运行的代码: def trans(z): print(z) mat = transforms.Compose([transforms.ToPILImage(),transforms.RandomRotation(90),transforms.ToTensor()]) z = Variable(mat(z.cpu()).cuda()) z = nnf.interpolate(z

我有一个火炬张量
z
,我想将变换矩阵
mat
应用于
z
,并使输出与
z
的大小完全相同。以下是我正在运行的代码:

def trans(z):
    print(z)
    mat = transforms.Compose([transforms.ToPILImage(),transforms.RandomRotation(90),transforms.ToTensor()])
    z = Variable(mat(z.cpu()).cuda())
    z = nnf.interpolate(z, size=(28, 28), mode='linear', align_corners=False)
    return z
z = trans(z)
但是,我得到了这个错误:

RuntimeError                              Traceback (most recent call last)
<ipython-input-12-e2fc36889ba5> in <module>()
      3 inputs,targs=next(iter(tst_loader))
      4 recon, mean, var = vae.predict(model, inputs[img_idx])
----> 5 out = vae.generate(model, mean, var)

4 frames
/content/vae.py in generate(model, mean, var)
     90     z = trans(z)
     91     z = Variable(z.cpu().cuda())
---> 92     out = model.decode(z)
     93     return out.data.cpu()
     94 

/content/vae.py in decode(self, z)
     56 
     57     def decode(self, z):
---> 58         out = self.z_develop(z)
     59         out = out.view(z.size(0), 64, self.z_dim, self.z_dim)
     60         out = self.decoder(out)

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
    720             result = self._slow_forward(*input, **kwargs)
    721         else:
--> 722             result = self.forward(*input, **kwargs)
    723         for hook in itertools.chain(
    724                 _global_forward_hooks.values(),

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/linear.py in forward(self, input)
     89 
     90     def forward(self, input: Tensor) -> Tensor:
---> 91         return F.linear(input, self.weight, self.bias)
     92 
     93     def extra_repr(self) -> str:

/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in linear(input, weight, bias)
   1674         ret = torch.addmm(bias, input, weight.t())
   1675     else:
-> 1676         output = input.matmul(weight.t())
   1677         if bias is not None:
   1678             output += bias

RuntimeError: mat1 dim 1 must match mat2 dim 0
运行时错误回溯(最近一次调用)
在()
3个输入,targs=下一个(iter(tst_加载器))
4侦察,平均值,var=价值预测(模型,输入[img_idx])
---->5 out=产生的价值(模型、平均值、var)
4帧
/生成中的content/vae.py(模型、平均值、var)
90 z=变速器(z)
91 z=变量(z.cpu().cuda())
--->92 out=型号解码(z)
93返回out.data.cpu()
94
/解码中的content/vae.py(self,z)
56
57 def解码(自,z):
--->58 out=self.z_develope(z)
59 out=out.view(z.size(0),64,self.z_dim,self.z_dim)
60输出=自译码器(输出)
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in_call_impl(self,*input,**kwargs)
720结果=self.\u slow\u forward(*输入,**kwargs)
721其他:
-->722结果=自转发(*输入,**kwargs)
723用于itertools.chain中的挂钩(
724 _全局_向前_hooks.values(),
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/linear.py前进(self,input)
89
90 def向前(自身,输入:张量)->张量:
--->91返回F线性(输入、自重、自偏压)
92
93 def额外报告(自我)->str:
/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py(输入、重量、偏差)
1674 ret=火炬.addmm(偏差、输入、重量.t())
1675其他:
->1676输出=输入.matmul(weight.t())
1677如果偏差不是无:
1678输出+=偏置
运行时错误:mat1尺寸1必须与mat2尺寸0匹配
如何成功应用此旋转变换
mat
,而不发生任何错误

谢谢,
Vinny

问题在于,
插值
需要一个批处理维度,并且根据错误消息和成功应用的
转换
,您的数据似乎没有批处理维度。因为您的输入是空间的(基于
大小=(28,28)
),您可以通过添加批处理维度并更改
模式来解决此问题,因为
线性
用于空间输入:

z=nnf.interpolate(z.unsqueze(0),size=(28,28),mode='双线性',align_corners=False)
如果希望
z
仍具有类似(C、H、W)的形状,则:

z=nnf.interpolate(z.unsqueze(0),size=(28,28),mode='bilinear',align_corners=False)。挤压(0)

我尝试了这个方法,但我得到了一个错误:
未实现错误:获得了4D输入,但线性模式需要3D输入
知道为什么会发生这种情况吗@Berriel?@VinnyJacobsen哦,这是真的…
线性
上采样不适用于空间输入。我相应地更新了答案。这让我回到最初的错误:
运行时错误:mat1尺寸1必须与mat2尺寸0匹配@Berriel@VinnyJacobsen这不是初始错误…请在
插值之前用
z.shape
更新问题call@VinnyJacobsen正如你所看到的,错误发生在其他地方…所以原来的问题已经解决了。这可能不是fu我也会跟踪的。