import numpy as np

import torch

# Input (temp, rainfall, humidity)

inputs = np.array([[73, 67, 43],

[91, 88, 64],

[87, 134, 58],

[102, 43, 37],

[69, 96, 70]], dtype=‘float32’)

# Targets (apples, oranges)

targets = np.array([[56, 70],

[81, 101],

[119, 133],

[22, 37],

[103, 119]], dtype=‘float32’)

# Convert inputs and targets to tensors

inputs = torch.from_numpy(inputs)

targets = torch.from_numpy(targets)

print(inputs)

print(targets)

# Weights and biases

w = torch.randn(2, 3, requires_grad=True)

b = torch.randn(2, requires_grad=True)

print(w)

print(b)

def model(x):

return x @ w.t() + b

# Generate predictions

preds = model(inputs)

print(preds)

# MSE(mean squared error) loss

def mse(t1, t2):

diff = t1 - t2

return torch.sum(diff * diff) / diff.numel()

# Compute loss

loss = mse(preds, targets)

print(loss)

# Compute gradients

loss.backward()

# Gradients for weights

print(w)

print(w.grad)

**Help me how is how w.grad is being calculated here**