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) 为真,但结果为假”的主要内容,如果未能解决你的问题,请参考以下文章