ihd*_*hdv 14 python numpy pytorch
我正在尝试为我的神经网络实现自定义数据集。但是在运行转发功能时出现此错误。代码如下。
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader
import numpy as np
class ParamData(Dataset):
def __init__(self,file_name):
self.data = torch.Tensor(np.loadtxt(file_name,delimiter = ',')) #first place
def __len__(self):
return self.data.size()[0]
def __getitem__(self,i):
return self.data[i]
class Net(nn.Module):
def __init__(self,in_size,out_size,layer_size=200):
super(Net,self).__init__()
self.layer = nn.Linear(in_size,layer_size)
self.out_layer = nn.Linear(layer_size,out_size)
def forward(self,x):
x = F.relu(self.layer(x))
x = self.out_layer(x)
return x
datafile = 'data1.txt'
net = Net(100,1)
dataset = ParamData(datafile)
n_samples = len(dataset)
#dataset = torch.Tensor(dataset,dtype=torch.double) #second place
#net.float() #thrid place
net.forward(dataset[0]) #fourth place
Run Code Online (Sandbox Code Playgroud)
文件中data1.txt
是一个包含特定数字的 csv 格式文本文件,每个文件dataset[i]
都是一个大小为 100 x 1torch.Tensor
的 dtype 对象torch.float64
。错误信息如下:
Traceback (most recent call last):
File "Z:\Wrong.py", line 33, in <module>
net.forward(dataset[0])
File "Z:\Wrong.py", line 23, in forward
x = F.relu(self.layer(x))
File "E:\Python38\lib\site-packages\torch\nn\modules\module.py", line 532, in __call__
result = self.forward(*input, **kwargs)
File "E:\Python38\lib\site-packages\torch\nn\modules\linear.py", line 87, in forward
return F.linear(input, self.weight, self.bias)
File "E:\Python38\lib\site-packages\torch\nn\functional.py", line 1372, in linear
output = input.matmul(weight.t())
RuntimeError: Expected object of scalar type Double but got scalar type Float for argument #2 'mat2' in call to _th_mm
Run Code Online (Sandbox Code Playgroud)
看来我应该将数字的 dtype 更改dataset
为torch.double
. 我试过这样的事情
将第一行更改为 self.data = torch.tensor(np.loadtxt(file_name,delimiter = ','),dtype=torch.double)
将第四位的行更改为 net.forward(dataset[0].double())
我认为这些是我从类似问题中看到的解决方案,但它们要么给出新的错误,要么什么都不做。我该怎么办?
更新:所以我通过将第一个位置更改为
self.data = torch.from_numpy(np.loadtxt(file_name,delimiter = ',')).float()
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为它与错误消息完全相反。这是一个错误吗?我还是想解释一下。
现在我对pytorch有了更多的经验,我想我可以解释错误信息了。这条线似乎
RuntimeError: Expected object of scalar type Double but got scalar type Float for argument #2 'mat2' in call to _th_mm
Run Code Online (Sandbox Code Playgroud)
实际上是指调用矩阵乘法时线性层的权重。由于输入是double
而权重是float
,因此该行是有意义的
output = input.matmul(weight.t())
Run Code Online (Sandbox Code Playgroud)
期望权重为double
。
简而言之:您的数据类型为double但您的模型类型为float,这在 pytorch 中是不允许的,因为只有具有相同 dtype 的数据才能输入模型。
In long:此问题与 PyTorch 和 Numpy 的默认 dtype 相关。我会先解释为什么会发生这个错误,然后提出一些解决方案(但我认为一旦你理解了原理,你就不需要我的解决方案了。)
torch.float32
(又名torch.float
)torch.float64
(又名torch.double
)重要的是要知道 PyTorch 张量的默认 dtype 是torch.float32
(又名torch.float
)。这意味着当你创建一个张量时,它的默认数据类型是torch.float32
.try: torch.ones(1).dtype
。这将torch.float32
在默认情况下打印。默认情况下,模型的参数也是这种 dtype。
在您的情况下,net = Net(100,1)
将创建一个模型,其参数类型为torch.float32
然后我们需要谈谈Numpy:
Numpy ndarray 的默认数据类型是numpy.float64
. 这意味着当你创建一个 numpy 数组时,它的默认数据类型是numpy.float64
.try: np.ones(1).dtype
。这将dtype('float64')
在默认情况下打印。
在您的情况下,您的数据来自由 加载的本地文件np.loadtxt
,因此数据首先作为dtype('float64')
(作为 numpy 数组)加载,然后转换为 dtype torch.float64
(又名torch.double
)的火炬张量。这就是将 numpy 数组转换为火炬张量时会发生的情况:它们将具有相应的 dtype。
我认为现在问题很清楚了,您有一个模型,其参数为torch.float32
(aka torch.float
),但尝试在torch.float64
(aka torch.double
) 的数据上运行它。这也是错误消息试图说明的内容:Expected object of scalar type Double but got scalar type Float for argument
解决方案:
torch.float32
通过调用将您的数据转换为tensor.float()
归档时间: |
|
查看次数: |
14994 次 |
最近记录: |