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))