利用Pytorch框架自己构建网络结构,在程序运行到“loss.backward()”的时候报错:
RuntimeError: expected dtype Double but got dtype Float (validate_dtype at ..\aten\src\ATen\native\TensorIterator.cpp:143)
(no backtrace available)
通过查询资料得知,该错误来自于输入数据的类型和模型参数类型不一致。因此最好在程序开始统一数据类型。
Pytorch里的tensor创建时默认是Torch.FloatTensor类型(torch.float32),
可通过在import语句后增加语句
torch.set_default_tensor_type(torch.DoubleTensor)
这样之后创建的变量类型都是Double类型(torch.float64)。
如果想要创建变量类型都是Float类型,在import后增加语句
torch.set_default_tensor_type(torch.FloatTensor)
后,执行卷积操作时会报错:
RuntimeError: Expected object of scalar type Double but got scalar type Float for argument #3 'mat1' in call to _th_addmm_
这是因为numpy的默认数据类型为float64,如果根据torch.from_numpy创建tensor,如b = torch.from_numpy(a),a和返回的b共享一块内存,因此b的类型也是torch.float64,即double类型。
因此如果想要项目中参数类型都为Float类型,不仅要加
torch.set_default_tensor_type(torch.FloatTensor)
还要在根据numpy数据创建tensor时将其转换为float类型
train_data_split = torch.from_numpy(train_data_split).float()
这样就不会报错了。
参考:
https://blog.csdn.net/chotin/article/details/104046744
https://pytorch.org/docs/stable/generated/torch.set_default_tensor_type.html
https://blog.csdn.net/Pl_Sun/article/details/106969577
https://discuss.pytorch.org/t/runtimeerror-expected-object-of-scalar-type-double-but-got-scalar-type-float-for-argument-2-weight/38961/13