我正在尝试使用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)