Ref: https://docs.pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html

import numpy as np

import torch
from torch import optim
from torch import nn
import torch.nn.functional as F
data = [[1, 2], [3, 4], [5, 6]]
t = torch.tensor(data)
t
tensor([[1, 2],
        [3, 4],
        [5, 6]])
torch.rand_like(t, dtype=torch.float)
tensor([[0.6160, 0.9337],
        [0.7736, 0.9430],
        [0.5630, 0.0227]])
t = torch.rand(3, 4)
t.shape, t.dtype, t.device
(torch.Size([3, 4]), torch.float32, device(type='cpu'))
device = torch.accelerator.current_accelerator() if torch.accelerator.is_available() else 'cpu'
t = t.to(device)
t.shape, t.dtype, t.device
(torch.Size([3, 4]), torch.float32, device(type='cuda', index=0))
t = torch.ones(5, 5, dtype=int)
t[:, 3] = 0
t
tensor([[1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1]])
torch.cat([t, t, t], dim=1)
tensor([[1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
        [1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1]])

Minimal PyTorch neural network

X = torch.randn(10, 1); y = 2 * X                        # data: y = 2x
model = nn.Linear(1, 1)                                  # model
opt = torch.optim.SGD(model.parameters(), lr=0.05)       # optimizer
loss_fn = nn.MSELoss()                                   # loss

for epoch in range(25):
    opt.zero_grad()                                      # 1. reset grads
    loss = loss_fn(model(X), y)                          # 2. forward + loss
    loss.backward()                                      # 3. backprop  ← grads now exist
    parts = [f"loss {loss.item():.4f}"] + [              # print after backward
        f"{name} {param.item():.4f} (grad {param.grad.item():.4f})"
        for name, param in model.named_parameters()
    ]
    print(" | ".join(parts))
    opt.step()                                           # 4. update weights
loss 7.2326 | weight -0.8592 (grad -5.0265) | bias -0.3763 (grad -0.2476)
loss 6.0221 | weight -0.6079 (grad -4.5810) | bias -0.3639 (grad -0.2673)
loss 5.0156 | weight -0.3789 (grad -4.1754) | bias -0.3506 (grad -0.2810)
loss 4.1784 | weight -0.1701 (grad -3.8060) | bias -0.3365 (grad -0.2898)
loss 3.4819 | weight 0.0202 (grad -3.4696) | bias -0.3220 (grad -0.2944)
loss 2.9023 | weight 0.1937 (grad -3.1632) | bias -0.3073 (grad -0.2956)
loss 2.4197 | weight 0.3519 (grad -2.8841) | bias -0.2925 (grad -0.2940)
loss 2.0178 | weight 0.4961 (grad -2.6298) | bias -0.2778 (grad -0.2900)
loss 1.6831 | weight 0.6275 (grad -2.3982) | bias -0.2633 (grad -0.2843)
loss 1.4042 | weight 0.7475 (grad -2.1871) | bias -0.2491 (grad -0.2770)
loss 1.1718 | weight 0.8568 (grad -1.9947) | bias -0.2353 (grad -0.2686)
loss 0.9780 | weight 0.9565 (grad -1.8195) | bias -0.2218 (grad -0.2594)
loss 0.8165 | weight 1.0475 (grad -1.6597) | bias -0.2089 (grad -0.2495)
loss 0.6817 | weight 1.1305 (grad -1.5141) | bias -0.1964 (grad -0.2392)
loss 0.5693 | weight 1.2062 (grad -1.3814) | bias -0.1844 (grad -0.2287)
loss 0.4756 | weight 1.2753 (grad -1.2604) | bias -0.1730 (grad -0.2180)
loss 0.3973 | weight 1.3383 (grad -1.1500) | bias -0.1621 (grad -0.2073)
loss 0.3320 | weight 1.3958 (grad -1.0494) | bias -0.1517 (grad -0.1967)
loss 0.2774 | weight 1.4483 (grad -0.9577) | bias -0.1419 (grad -0.1863)
loss 0.2319 | weight 1.4962 (grad -0.8741) | bias -0.1326 (grad -0.1762)
loss 0.1938 | weight 1.5399 (grad -0.7978) | bias -0.1238 (grad -0.1663)
loss 0.1621 | weight 1.5797 (grad -0.7282) | bias -0.1155 (grad -0.1567)
loss 0.1355 | weight 1.6162 (grad -0.6647) | bias -0.1076 (grad -0.1474)
loss 0.1133 | weight 1.6494 (grad -0.6068) | bias -0.1002 (grad -0.1386)
loss 0.0948 | weight 1.6797 (grad -0.5540) | bias -0.0933 (grad -0.1301)
# Input, output and prediction
with np.printoptions(precision=4, suppress=True):
    print(torch.cat([X, y, model(X)], dim=1).detach().numpy())
[[-0.9295 -1.859  -1.6739]
 [-0.384  -0.768  -0.7425]
 [ 1.663   3.3259  2.7526]
 [ 1.0355  2.071   1.6813]
 [ 0.1104  0.2209  0.1017]
 [-1.2856 -2.5712 -2.2819]
 [-0.3015 -0.603  -0.6016]
 [-1.3607 -2.7215 -2.4102]
 [ 0.6638  1.3276  1.0466]
 [-0.0945 -0.189  -0.2482]]