运行时错误:期望标量类型为 Long 的对象,但是参数 #2 'mat2' 的标量类型为 Float,如何修复它?

4

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行,prediction = netSECOND(netFIRST(x))

第1371行,linear函数; output = input.matmul(weight.t())

运行时错误:预期标量类型为Long,但参数#2 'mat2'的标量类型为Float。

我真的看不出我错在哪里。我已经尝试以各种可能的方式将所有内容转换为Long。我真的不理解pytorch中的类型是如何工作的。上次我尝试了只有一个层的东西,它迫使我使用类型int

能否有人解释一下在pytorch中如何确定类型以及如何防止和修复此类错误?非常感谢您提前提供帮助,这个问题真的很困扰我,无论我尝试什么都无法解决。

1个回答

2
权重是Floats类型,输入是Longs类型。这是不允许的。事实上,我认为torch在神经网络中只支持Floats类型。
如果你删除所有对long的调用,并将输入定义为floats类型,它就可以工作(我试过了)。
(然后你会得到另一个无关的错误:你需要对损失进行求和)

2
没关系,我已经弄清楚它是如何工作的。我需要删除所有的dtype long,然后将dtype更改为torch.float,当然还有损失函数中的求和。 - hal9000
非常感谢您。如果满意,请标记答案为已接受(点击勾号)。 - Martino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接