I have some basic doubts.

- If loss.backward() is done, there shouldn’t be requires_grad=True while creating x_data or y_data?
- In line y_pred = model(x_data), How does this call forward function, In
**init**, x_data is not taken as parameter or forward function is not called. How come is it is returning predicted y? - What does model(hour_var).data[0][0].item() Mean in the last statement?

Thanks

from torch import nn

import torch

from torch import tensor

x_data = tensor([[1.0], [2.0], [3.0]])

y_data = tensor([[2.0], [4.0], [6.0]])

class Model(nn.Module):

def **init**(self):

super(Model, self).**init**()

self.linear = torch.nn.Linear(1, 1) # One in and one out

```
def forward(self, x):
y_pred = self.linear(x)
return y_pred
```

model = Model()

criterion = torch.nn.MSELoss(reduction=‘sum’)

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

for epoch in range(500):

y_pred = model(x_data)

loss = criterion(y_pred, y_data)

print(f’Epoch: {epoch} | Loss: {loss.item()} ')

optimizer.zero_grad()

loss.backward()

optimizer.step()

# After training

hour_var = tensor([[4.0]])

y_pred = model(hour_var)

print(“Prediction (after training)”, 4, model(hour_var).data[0][0].item())