pytorch 错误:“预期 isFloatingType(grad.scalar_type()) || (input_is_complex == grad_is_complex) 为真,但结果为假”

Posted

技术标签:

【中文标题】pytorch 错误:“预期 isFloatingType(grad.scalar_type()) || (input_is_complex == grad_is_complex) 为真,但结果为假”【英文标题】:pytorch error : " Expected isFloatingType(grad.scalar_type()) || (input_is_complex == grad_is_complex) to be true, but got false " 【发布时间】:2022-01-22 13:31:40 【问题描述】:

我正在研究分类问题的实现。 在将复杂噪声插入输出层之前,我的代码运行良好。

以下代码不适用于 Pytorch 错误

def forward(self, x):
    #Encoder Process
    out = self.feature(x)
    out = self.encoder(out)
    out = self.last(out)

    #### Start of error point ######
    batch_size, y = out.size()
    out_real = x[:, 0:int(y / 2)]
    out_comp = x[:, int(y / 2) : y + 1]
    out_comp = out_comp * 1j
    symbols = out_real + out_comp

    n = torch.randn(symbols.shape. dtype=torch.cfloat).to(device) 
    out = symbols + n 
    out_real = out.real 
    out_imag = out.imag 
    out = torch.cat((out_real, out_imag),1)
    #### End of error point ######

    #Decoder process
    out0 = self.decoder0(out)

    out1 = self.decoder1(out0)
    out1 += self.shortcut(out0)

    out2 = self.decoder2(out1)
    out2 += self.shortcut(out1)

在添加### start of error point ### ... ### end of error point ### 行之前,代码运行良好且分类运行良好。 但是添加代码后我在最后一行收到以下错误:

    ---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-8-a131419c404b> in <module>
      6 for epoch in range(start_epoch, start_epoch+total_epoch):
      7     start = time.time()
----> 8     train(epoch, scheduler)
      9     end = time.time()
     10     total_time += (end-start)

<ipython-input-4-d3b479d83256> in train(epoch, scheduler)
     48         top5 = accuracy(outputs, targets, topk=(1, 5))
     49 
---> 50         loss.backward()
     51         optimizer.step()
     52         scheduler.step(epoch +batch_idx/iters)

~\Anaconda3\envs\1DCNN\lib\site-packages\torch\tensor.py in backward(self, gradient, retain_graph, create_graph)
    219                 retain_graph=retain_graph,
    220                 create_graph=create_graph)
--> 221         torch.autograd.backward(self, gradient, retain_graph, create_graph)
    222 
    223     def register_hook(self, hook):

~\Anaconda3\envs\1DCNN\lib\site-packages\torch\autograd\__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
    130     Variable._execution_engine.run_backward(
    131         tensors, grad_tensors_, retain_graph, create_graph,
--> 132         allow_unreachable=True)  # allow_unreachable flag
    133 
    134 

RuntimeError: Expected isFloatingType(grad.scalar_type()) || (input_is_complex == grad_is_complex) to be true, but got false.  (Could this error message be improved?  If so, please report an enhancement request to PyTorch.)

此正向函数模拟在复杂 AWGN 通道上传输图像。 所以,输入x 是一个图像。 ### start of error point ### ... ### end of error point ### 部分表示添加复杂噪声。

这个问题是不是因为在forward(x)函数中间加了复数所以学习不起作用?

如果输入是真实的,但我想把复数放在前向函数的中间,那该怎么办?

【问题讨论】:

请复制粘贴此错误消息的堆栈跟踪。 【参考方案1】:

我认为此错误消息是您最不必担心的。

你想做什么?当您将特征视为两个实部时,添加复杂噪声的含义是什么?与只是为out 增加噪音有什么不同?

如果你真的想让你的解码器变得复杂,你应该将out 保留为一个复杂的张量,并允许解码器的权重和快捷方式也变得复杂。这实际上会在你的张量的实部和虚部之间创建交互。目前,out 的实部和虚部没有“复杂”的含义,它们只是附加维度。

【讨论】:

感谢您的评论。我添加了一条错误消息并编辑了问题

以上是关于pytorch 错误:“预期 isFloatingType(grad.scalar_type()) || (input_is_complex == grad_is_complex) 为真,但结果为假”的主要内容,如果未能解决你的问题,请参考以下文章

pytorch 安装错误,报 GLIBCXX_3.4.20 错误

自定义权重初始化导致错误 - pytorch

上一批Pytorch损失函数错误

pytorch:“不支持多目标”错误消息

Pytorch GAN 模型未训练:矩阵乘法错误

Pytorch 错误:“BiSeNet”对象没有属性“模块”