无法计算Pytroch中的验证错误

时间:2019-05-21 05:37:12

标签: python neural-network pytorch

我正在尝试使用Pytorch中的训练循环拟合神经网络,但是由于输出-输入大小不匹配,我无法计算训练循环中的验证错误。主要问题在于,验证集中的输出大小始终等于训练神经网络最后阶段的输出大小,并且不等于验证数据加载器给出的输入大小。

在以下代码中,prds的预期输出大小为长度40,但是下面的代码给出了长度为8的prds,即上一次训练循环中y_pred的大小。结果,损失函数不起作用,因为它获得了一个长度为8 prds的输入和一个长度为40 y_val的输入。如果有人可以帮助我找到正确长度的prds的方法,我将不胜感激。

注意:如果我在整个训练循环之外(即在所有时期结束之后)运行验证集,则会计算出验证错误。这是我的代码

net = MixedInputModel(emb_szs,len(contin_vars), 0.04, 1, [100,50], [0.0001,0.0001] ,y_range=y_range, use_bn=True, is_reg=True, is_multi=False)
loss = nn.MSELoss()
learning_rate = 1e-2
opt = optim.SGD(net.parameters(),lr = learning_rate,momentum = 0.9, weight_decay = 1e-3)
scheduler = torch.optim.lr_scheduler.StepLR(opt,1)

for epoch in range(1): 
  losses,losses_val=[],[]
  net.train()
  dl = iter(md.trn_dl)
​
  for t in range(len(list(md.trn_dl))): #number of batches
    l = next(dl)
    x_cat, x_cont,y = l
    #net.train()
    #opt.zero_grad()
    #a. Forward pass: compu
    y_pred = net(V(x_cat),V(x_cont))
    #print(y_pred)
    ls = loss(y_pred, V(y))
    losses.append(ls) 

    # b.Use the optimizer object to zero all of the gradients for the variables to be updated (which are the learnable weights of the model)
    opt.zero_grad()
    #c. Backward pass: compute gradient of the loss with respect to model parameters
    ls.backward()
    #d. Calling the step function on an Optimizer makes an update to its parameters
    opt.step()
    scheduler.step()

  #validation loop 
  net.eval()
  vali_dl = iter(md.val_dl)
  for tt in range(len(list(md.val_dl))):
    vdl = next(vali_dl)
    xv_cat,xv_cont,y_val = vdl
    prds = net(V(xv_cat),V(xv_cont))
    ls_val = loss(prds, V(y_val))
    losses_val.append(ls_val)

print(losses_val)
​
print(losses)

0 个答案:

没有答案