【问题标题】:Pytorch model 2D regression given an scalar input给定标量输入的 Pytorch 模型 2D 回归
【发布时间】:2021-04-25 00:08:36
【问题描述】:

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

我的数据集如下所示:

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 和网络结构方面遇到了一些问题(我添加了一层以简化问题)

这是我的代码: 网:

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, nan],
        [nan, nan],
...

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

【问题讨论】:

    标签: neural-network pytorch regression


    【解决方案1】:

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

    【讨论】:

    • 我看到的所有实现都调用自定义损失函数(或像 nn.MSELoss 这样的预定义)来获取错误值,然后向后调用。你能写出正确的实现吗?
    • @Loren 在您偷偷修改代码和错误消息后,我的回答不再相关。我在您的实施中没有看到任何特别的不当行为,所以我认为问题出在您的数据上。您能否发布一个最小代码(stackoverflow.com/help/minimal-reproducible-example),也许您的数据集中有一些特定的张量可以重现问题?其中一些可能有奇怪的值
    • 问题是所有的净输出都是tensor([[nan, nan],...]),而输入和标签的值很好,因此我认为损失不会改变。我的网络是一个单一的线性网络,训练在任何时候都不会崩溃,但由于某种原因不起作用......数据集是这样的:dataset我刚刚用 nan 替换了 '-'。
    • 只是为了确定:您将整个数据集('-' 作为 NaN)输入到您的网络中,而不对其进行清理(如删除 NaN)?如果是,那么难怪,根据定义,NaN 会通过所有算术运算传播(无论您对 NaN 做什么,它都会产生 NaN)
    • 我想说,要么删除所有包含 NaN 的数据帧(更容易),要么进行插值:从前一帧/下一帧推断它们的值(更智能)。无论哪种方式都应该为您提供一个干净的数据集(没有 NaN),然后您可以将其提供给您的网络。数据集清理本身就是一个完整的问题,因此您可能还想阅读互联网可以告诉您的相关信息
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2017-12-06
    • 2021-06-03
    • 2019-02-09
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多