Я работаю в классификаторе музыкальных нот.
У меня есть простая многослойная запись персептрона в Pytorch. Мои музыкальные ноты изолированы. Я просто пытаюсь узнать одну ноту каждый раз.
Мой персептрон имеет вход формы 252 и выход 88.
В цели, если я попытался распознать ноту 2, у меня есть тензор вроде:
[0,0,1,0 ..., 0,0,0], с 88 элементами.
Train_loader возвращает как input, [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 и, возможно, я что-то не так делаю.
Спасибо за вашу помощь.