Spaces:
Runtime error
Runtime error
| import torch | |
| def define_optimizer(model, lr, alpha): | |
| # Define optimizer | |
| optimizer = torch.optim.RMSprop(model.parameters(), lr=lr, alpha=alpha) | |
| optimizer.zero_grad() | |
| return optimizer | |
| def tuple_of_tensors_to_tensor(tuple_of_tensors): | |
| return torch.stack(list(tuple_of_tensors), dim=0) | |
| def predict(model, inputs, notes, device): | |
| outputs = model.forward(inputs, notes) | |
| predicted = torch.sigmoid(outputs) | |
| predicted = (predicted>0.5).float() | |
| return outputs, predicted | |
| def display_train(epoch, num_epochs, i, model, correct, total, loss, train_loader, valid_loader, device): | |
| print (f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Train Loss: {loss.item():.4f}') | |
| train_accuracy = correct/total | |
| print(f'Epoch [{epoch+1}/{num_epochs}], Train Accuracy: {train_accuracy:.4f}') | |
| valid_loss, valid_accuracy = eval_valid(model, valid_loader, epoch, num_epochs, device) | |
| return train_accuracy, valid_accuracy, valid_loss | |
| def eval_valid(model, valid_loader, epoch, num_epochs, device): | |
| # Compute model train accuracy on test after all samples have been seen using test samples | |
| model.eval() | |
| with torch.no_grad(): | |
| correct = 0 | |
| total = 0 | |
| running_loss = 0 | |
| for inputs, labels, notes in valid_loader: | |
| # Get images and labels from test loader | |
| inputs = inputs.transpose(1,2).float().to(device) | |
| labels = labels.float().to(device) | |
| notes = notes.to(device) | |
| # Forward pass and predict class using max | |
| # outputs = model(inputs) | |
| outputs, predicted = predict(model, inputs, notes, device) #torch.max(outputs.data, 1) | |
| loss = torch.nn.functional.binary_cross_entropy_with_logits(outputs, labels) | |
| running_loss += loss.item()*len(labels) | |
| # Check if predicted class matches label and count numbler of correct predictions | |
| total += labels.size(0) | |
| #TODO: change acc criteria | |
| # correct += torch.nn.functional.cosine_similarity(labels,predicted).sum().item() # (predicted == labels).sum().item() | |
| values, indices = torch.max(outputs,dim=1) | |
| correct += sum(1 for s, i in enumerate(indices) | |
| if labels[s][i] == 1) | |
| # Compute final accuracy and display | |
| valid_accuracy = correct/total | |
| validation_loss = running_loss/total | |
| print(f'Epoch [{epoch+1}/{num_epochs}], Validation Accuracy: {valid_accuracy:.4f}, Validation Loss: {validation_loss:.4f}') | |
| return validation_loss, valid_accuracy | |
| def eval_test(model, test_loader, device): | |
| # Compute model test accuracy on test after training | |
| model.eval() | |
| with torch.no_grad(): | |
| correct = 0 | |
| total = 0 | |
| for inputs, labels, notes in test_loader: | |
| # Get images and labels from test loader | |
| inputs = inputs.transpose(1,2).float().to(device) | |
| labels = labels.float().to(device) | |
| notes = notes.to(device) | |
| # Forward pass and predict class using max | |
| # outputs = model(inputs) | |
| outputs, predicted = predict(model, inputs, notes, device)#torch.max(outputs.data, 1) | |
| # Check if predicted class matches label and count numbler of correct predictions | |
| total += labels.size(0) | |
| #TODO: change acc criteria | |
| # correct += torch.nn.functional.cosine_similarity(labels,predicted).sum().item() # (predicted == labels).sum().item() | |
| values, indices = torch.max(outputs,dim=1) | |
| correct += sum(1 for s, i in enumerate(indices) | |
| if labels[s][i] == 1) | |
| # Compute final accuracy and display | |
| test_accuracy = correct/total | |
| print(f'Ended Training, Test Accuracy: {test_accuracy:.4f}') | |
| return test_accuracy |