Pytorch Neural Network from Scratch

Sample

x = [[1.0],[1.0]] y = [[5.0],[2.0]] W = [[1.0,1.0],[1.0,2.0]] input = torch.tensor(x) weights = torch.tensor(W, requires_grad=True) output = torch.tensor(y) result = weights @ input error1 = output-result loss = error1.T @ error1 loss.backward() grad = weights.grad

Training

epochs = 20 for epoch in range(epochs): # 1. Forward pass result = weights @ input error1 = output - result loss = error1.T @ error1 #get total loss as a float numeric_loss = loss.item() # 2. Backward pass loss.backward() # 3. Update weights manually with torch.no_grad(): weights -= learning_rate * weights.grad weights.grad.zero_() # Reset gradients for the next loop

Using a Pytorch Optimizer

optimizer = torch.optim.SGD([weights], lr=learning_rate) # 3. Multi-step optimization loop epochs = 100 for step in range(epochs): # Clear out old gradients from the previous step optimizer.zero_grad() # Forward pass: calculate prediction and loss result = weights @ input error1 = output - result loss = error1.T @ error1 #get total loss as a float numeric_loss = loss.item() print('loss is '+str(numeric_loss)) # Backward pass: compute the gradients loss.backward() # Optimization step: update the weights using SGD math optimizer.step() print('final loss = '+str(numeric_loss)) print('final weights is '+str(weights)) print('final output is '+str(weights@input))