微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定标量输入的 Pytorch 模型 2D 回归

如何解决给定标量输入的 Pytorch 模型 2D 回归

我想创建一个模型来执行这个回归:

2D Regression

我的数据集看起来像:

t,x,y
0.0,-,0.5759052335487023
0.01,-
0.02,1.1159124144549086,-
0.03,-
0.04,1.0054825084650338,0.4775267298487888
0.05,-

我在损失、数据集加载、batch_size 和 Net 结构方面遇到了一些麻烦(我添加了一层以简化问题)

那是我的代码: 净:

class Net(nn.Module):
    '''Model to regress 2d time series values given scalar input.'''
    def __init__(self):
        super(Net,self).__init__()
        #Layers
        self.predict = nn.Linear(1,2) 

    def forward(self,x):
        x = self.predict(x)
        return x

数据集加载

class TimeSeriesDataset(torch.utils.data.Dataset):

    def __init__(self,csv_file):
        #Load the dataset
        #Load the csv file as a dataframe
        df = pd.read_csv(csv_file,header=0,na_values='-')
        #Store the inputs and outputs
        self.x = df.values[:,:-2].astype('float32')
        self.y = df.values[:,1:].astype('float32')
        #Ensure target has the right shape
        self.y = self.y.reshape((len(self.y),2))

    def __len__(self):
        #Return the number of rows in the dataset
        return len(self.x)

    def __getitem__(self,idx):
        #Return a row at an index
        return [self.x[idx],self.y[idx]]

Trainloader、损失、优化器

dataset = TimeSeriesDataset('data.csv')
trainloader = torch.utils.data.DataLoader(
    dataset,batch_size=32,shuffle=True,num_workers=2)

def lossFunc(outputs,labels):
  # nn.MSELoss() #Mean Squared Error,works fine with regression problems and with small numbers (x-y)^2
  return torch.mean((outputs-labels)**2)

net = Net()
optimizer = torch.optim.SGD(net.parameters(),lr=0.01)
print(net)

培训:

for epoch in range(300):

    running_loss = 0.0
    for i,data in enumerate(trainloader,0):
        # Todo get the data
        # inputs,labels
        inputs,labels = data
        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        #print("Inputs",inputs)
        #print("labels",labels)
        #print("outputs",outputs)
        loss = lossFunc(outputs,labels)
        loss.backward()
        optimizer.step()
        
        # print statistics
        running_loss += loss.item()
        if i % 20 == 19:    # print every 20 mini-batches
            print('[%d,%5d] loss: %.3f' %
                  (epoch + 1,i + 1,running_loss / 20))
            running_loss = 0.0

print('Finished Training')

输出看起来像这样:

tensor([[nan,nan],[nan,...

当我执行 300 epochs 错误值不会改变并打印 nan

解决方法

在行 loss = loss(outputs,labels) 之后,loss 现在是一个张量,不再是一个函数。 Python 不允许您拥有具有相同名称的不同对象。 所以在第一次调用后,loss 变成了一个张量,并且由于错误说“张量不可调用”,所以第二次调用失败

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。