问题描述
我想创建一个模型来执行这个回归:
我的数据集看起来像:
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
变成了一个张量,并且由于错误说“张量不可调用”,所以第二次调用失败