我的训练和验证功能不学​​习

时间:2019-06-12 15:15:12

标签: python neural-network pytorch perceptron

我正在用音符分类器工作。 我在Pytorch中编写了一个简单的多层感知器。我的音符是孤立的。我只是想每次识别一个音符。

我的感知器的输入形状为252,输出为88。 在目标中,如果我试图识别音符2,则我的张量如下: [0,0,1,0 ...,0,0,0],包含88个元素。

train_loader会像输入[batch_size,252]一样返回,目标是[batch_size,88]。

数据集已标准化,但准确性确实很差。 (如9%)。

我检查了所有内容,并尝试使用不同的超参数,但是网络无法给我很好的结果。

我的火车代码是:

def train(model, train_loader, optimizer, criterion):
model.train()
for idx_batch, (input,target) in enumerate(train_loader):
    optimizer.zero_grad()
    input = input.cuda()
    target = target.cuda()
    outputs = model(input) 
    loss = criterion(outputs, target)
    loss.backward()   
    optimizer.step()
    train_loss += loss.item()
return train_loss

每次训练时,我都会进行一次验证测试:

def val(model, val_loader, optimizer, criterion):
model.eval()
val_loss = 0
with torch.no_grad():
    for idx_batch, (input, target) in enumerate(val_loader):
         input = input.cuda()
         target = target.cuda()
        outputs = model(input)
        loss = criterion(outputs, target)
        val_loss += loss.item()
return val_loss

这是我在新纪元进行训练和验证的代码,之后是测试部分。

    for epoch in range(1, N_EPOCHS+1):
    print("------------EPOCHS ",epoch,"------------")
    train_loss = 0
    val_loss = 0
    train_loss = train(mlp, train_loader, optimizer, criterion)
    val_loss = val(mlp, val_loader, optimizer, criterion)

    #Mean of losses
    train_loss = train_loss/len(train_loader.dataset)
    val_loss = val_loss/len(val_loader.dataset)

    #Stats training and validation.
    print('Epoch: {} \tTraining loss: {:.6f} \tValidation loss:{:.6f}'.format(epoch, train_loss, val_loss))


mlp.eval()
for data, target in test_loader:

    data = data.to('cuda')
    target = target.to('cuda')
    outputs = mlp(data)
    loss = criterion(outputs, target)
    test_loss += loss.item() 
    pred = torch.max(outputs, 1)[1]
    t = torch.max(target, 1)[1]
    correct += pred.eq(t).sum()
    print("Correct: {}/len(test_loader.dataset) ")

我是Pytorch的新手,也许我做的不对。

谢谢您的帮助。

0 个答案:

没有答案