RuntimeError: 标量类型 Long 的预期对象,但参数 #2 'mat2' 的标量类型 Float 如何解决?

Posted

技术标签:

【中文标题】RuntimeError: 标量类型 Long 的预期对象,但参数 #2 \'mat2\' 的标量类型 Float 如何解决?【英文标题】:RuntimeError: Expected object of scalar type Long but got scalar type Float for argument #2 'mat2' how to fix it?RuntimeError: 标量类型 Long 的预期对象,但参数 #2 'mat2' 的标量类型 Float 如何解决? 【发布时间】:2020-01-29 03:16:15 【问题描述】:

import torch.nn as nn 
import torch 
import torch.optim as optim
import itertools

class net1(nn.Module):
    def __init__(self):
        super(net1,self).__init__()

        self.pipe = nn.Sequential(
            nn.Linear(10,10),
            nn.ReLU()
        )

    def forward(self,x):
        return self.pipe(x.long())

class net2(nn.Module):
    def __init__(self):
        super(net2,self).__init__()

        self.pipe = nn.Sequential(
            nn.Linear(10,20),
            nn.ReLU(),
            nn.Linear(20,10)
        )

    def forward(self,x):
        return self.pipe(x.long())



netFIRST = net1()
netSECOND = net2()

learning_rate = 0.001

opt = optim.Adam(itertools.chain(netFIRST.parameters(),netSECOND.parameters()), lr=learning_rate)

epochs = 1000

x = torch.tensor([1,2,3,4,5,6,7,8,9,10],dtype=torch.long)
y = torch.tensor([10,9,8,7,6,5,4,3,2,1],dtype=torch.long)


for epoch in range(epochs):
    opt.zero_grad()

    prediction = netSECOND(netFIRST(x))
    loss = (y.long() - prediction)**2
    loss.backward()

    print(loss)
    print(prediction)
    opt.step()

错误:

第 49 行,预测 = netSECOND(netFIRST(x))

第 1371 行,线性;输出 = input.matmul(weight.t())

RuntimeError: 标量类型的预期对象 Long 但得到标量类型 参数 #2 'mat2' 的浮点数

我真的不明白我做错了什么。我试图以各种可能的方式将所有内容转换为Long。我真的不明白pytorch的打字方式。上次我尝试了只有一层的东西,它迫使我使用类型int。 有人可以解释一下pytorch中的打字是如何建立的,以及如何预防和修复这样的错误吗? 非常感谢,这个问题真的很困扰我,无论我尝试什么,我似乎都无法解决它。

【问题讨论】:

【参考方案1】:

权重是浮点数,输入是长整数。这是不允许的。事实上,我不认为 Torch 支持神经网络中的浮点数以外的任何东西。

如果您删除 所有 对 long 的调用,并将您的输入定义为浮点数,它将起作用(确实如此,我试过了)。

(然后你会得到另一个不相关的错误:你需要总结你的损失)

【讨论】:

没关系弄清楚它是如何工作的。我需要删除所有 dtype long,然后将 dtype 更改为 torch.float 并在 loss of course 中求和。 不客气。如果满意,请将答案标记为已接受(单击对勾)。

以上是关于RuntimeError: 标量类型 Long 的预期对象,但参数 #2 'mat2' 的标量类型 Float 如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch RuntimeError:参数#1 'indices' 的预期张量具有标量类型 Long;但得到了 CUDAType

通过 DataLoader (PyTorch) 迭代:RuntimeError: 标量类型 unsigned char 的预期对象但序列元素 9 的标量类型浮点数

pytorch RuntimeError: 标量类型 Double 的预期对象,但得到标量类型 Float

RuntimeError:预期的标量类型 Double 但发现 Float

RuntimeError:预期的标量类型为 Double 的对象,但在调用 _th_max 时为参数 #2 'other' 获得了标量类型 Float

Pytorch RuntimeError:预期的标量类型 Float 但找到了字节