Python “如何修复运行时错误”;应为标量类型Float的对象,但参数";的标量类型为Double;?

Python “如何修复运行时错误”;应为标量类型Float的对象,但参数";的标量类型为Double;?,python,neural-network,deep-learning,classification,pytorch,Python,Neural Network,Deep Learning,Classification,Pytorch,我正在尝试通过PyTorch训练分类器。但是,当我向模型提供训练数据时,我遇到了训练问题。 我在y\u pred=model(X\u trainTensor)上得到这个错误: RuntimeError:应为标量类型Float的对象,但参数#4'mat1'的标量类型为Double 以下是我的代码的关键部分: #超参数 D_in=47#我研究了47个参数 H=33 D_out=2#输出应为1或0 #格式化并加载数据 y=np.array(df['target']) X=np.array(df.dr

我正在尝试通过PyTorch训练分类器。但是,当我向模型提供训练数据时,我遇到了训练问题。 我在
y\u pred=model(X\u trainTensor)
上得到这个错误:

RuntimeError:应为标量类型Float的对象,但参数#4'mat1'的标量类型为Double

以下是我的代码的关键部分:

#超参数
D_in=47#我研究了47个参数
H=33
D_out=2#输出应为1或0
#格式化并加载数据
y=np.array(df['target'])
X=np.array(df.drop(列=['target'],轴=1))
X_系列,X_测试,y_系列,y_测试=系列测试分割(X,y,系列大小=0.8)#分割训练/测试数据
X_列张量=火炬。从_numpy(X_列)#转换为张量
y\u列车Tensor=火炬,来自y\u列车
X\u测试张量=火炬。从X\u测试开始
y\u测试张量=火炬。从y\u numpy(y\u测试)
#定义模型
型号=torch.nn.Sequential(
火炬nn线性(D_in,H),
torch.nn.ReLU(),
火炬nn线性(H,D_out),
nn.LogSoftmax(尺寸=1)
)
#定义损失函数
损耗=torch.nn.NLLLoss()
范围(50)内的i的
:
y_pred=模型(X_列张量)
损耗=损耗fn(y\u pred,y\u trainTensor)
模型0_梯度()
loss.backward()
使用手电筒。无梯度()
对于model.parameters()中的参数:
参数-=学习率*参数梯度
参考来自

当错误为
RuntimeError:Expected object of scalar type Float,但参数#4'mat1'
得到scalar type Double时,您需要使用
.Float()
函数,因为它表示
Expected object of scalar type Float

因此,解决方案是将
y\u pred=model(X\u trainTensor)
更改为
y\u pred=model(X\u trainTensor.float())

同样,当您收到另一个错误时,您需要
y\u trainTensor.long()
,因为错误消息显示
标量类型long的预期对象

您还可以按照@Paddy的建议执行
model.double()

.

通过将输入的数据类型设置为Double(即
torch.float32

我希望问题是因为您的数据类型是
torch.float64

您可以在设置数据时避免这种情况,如其他答案之一所述,或者使模型类型也与数据类型相同。i、 e使用float64或float32


对于调试,请打印obj.dtype并检查一致性。

如果选择了错误的丢失功能,也会出现此问题。例如,如果你有回归问题,但你试图使用交叉熵损失。然后通过更改MSE上的损失函数来修复它

我也有同样的问题

断然的 在转换为张量之前,请尝试以下操作

X_train = X_train.astype(np.float32)
尝试使用:
target=target.float()#target是错误的名称

它是否告诉您触发运行时错误的代码行?是的,在我的上一个代码块中
y_pred=model(X_trainTensor)
触发它。我不使用Pytork,但您可以使用
model(float(X_trainTensor))
我在同一行上得到以下错误:
ValueError:如果我将张量强制转换为所有浮点,则只有一个元素张量可以转换为Python标量。我得到一个新错误:
AttributeError:“内置函数”或“方法”对象没有属性“dim”