Files
Karpathy_ZtH_Learning/My_Experiments/pytorch3.ipynb
T

7.5 KiB

Manual approach

In [3]:
import torch

X = torch.tensor([[0.0],[10.0], [20.0], [30.0], [40.0]])
Y = torch.tensor([[32.0], [50.0], [68.0], [86.0], [104.0]])
In [4]:
W = torch.randn((1, 1), requires_grad=True)
B = torch.randn((1, 1), requires_grad=True)
In [13]:
learning_rate = 0.001

for epoch in range(20000):
    Y_pred = X.matmul(W) + B

    loss = ((Y_pred - Y)**2).mean()

    loss.backward()
    with torch.no_grad():
        W -= learning_rate * W.grad
        B -= learning_rate * B.grad

        W.grad.zero_()
        B.grad.zero_()

    if epoch % 400 == 0:
        print(f"Epoch {epoch}: Loss = {loss.item():.4f}")
Epoch 0: Loss = 42.0600
Epoch 400: Loss = 24.6847
Epoch 800: Loss = 14.4873
Epoch 1200: Loss = 8.5024
Epoch 1600: Loss = 4.9900
Epoch 2000: Loss = 2.9286
Epoch 2400: Loss = 1.7188
Epoch 2800: Loss = 1.0087
Epoch 3200: Loss = 0.5920
Epoch 3600: Loss = 0.3474
Epoch 4000: Loss = 0.2039
Epoch 4400: Loss = 0.1197
Epoch 4800: Loss = 0.0702
Epoch 5200: Loss = 0.0412
Epoch 5600: Loss = 0.0242
Epoch 6000: Loss = 0.0142
Epoch 6400: Loss = 0.0083
Epoch 6800: Loss = 0.0049
Epoch 7200: Loss = 0.0029
Epoch 7600: Loss = 0.0017
Epoch 8000: Loss = 0.0010
Epoch 8400: Loss = 0.0006
Epoch 8800: Loss = 0.0003
Epoch 9200: Loss = 0.0002
Epoch 9600: Loss = 0.0001
Epoch 10000: Loss = 0.0001
Epoch 10400: Loss = 0.0000
Epoch 10800: Loss = 0.0000
Epoch 11200: Loss = 0.0000
Epoch 11600: Loss = 0.0000
Epoch 12000: Loss = 0.0000
Epoch 12400: Loss = 0.0000
Epoch 12800: Loss = 0.0000
Epoch 13200: Loss = 0.0000
Epoch 13600: Loss = 0.0000
Epoch 14000: Loss = 0.0000
Epoch 14400: Loss = 0.0000
Epoch 14800: Loss = 0.0000
Epoch 15200: Loss = 0.0000
Epoch 15600: Loss = 0.0000
Epoch 16000: Loss = 0.0000
Epoch 16400: Loss = 0.0000
Epoch 16800: Loss = 0.0000
Epoch 17200: Loss = 0.0000
Epoch 17600: Loss = 0.0000
Epoch 18000: Loss = 0.0000
Epoch 18400: Loss = 0.0000
Epoch 18800: Loss = 0.0000
Epoch 19200: Loss = 0.0000
Epoch 19600: Loss = 0.0000
In [15]:
with torch.no_grad():
    X_test = torch.tensor([[100.0]])
    Y_test_pred = X_test.matmul(W) + B
    print("\n--- Результаты обучения ---")
    print(f"Предсказание для 100°C: {Y_test_pred.item():.2f}°F (Ожидалось: 212.00)")
    print(f"Итоговый вес W: {W.item():.4f} (Ожидалось: 1.8)")
    print(f"Итоговое смещение B: {B.item():.4f} (Ожидалось: 32.0)")
--- Результаты обучения ---
Предсказание для 100°C: 211.99°F (Ожидалось: 212.00)
Итоговый вес W: 1.7999 (Ожидалось: 1.8)
Итоговое смещение B: 32.0029 (Ожидалось: 32.0)

Professional approach

In [16]:
import torch
import torch.nn as nn
import torch.optim as optim

X = torch.tensor([[0.0],[10.0], [20.0], [30.0], [40.0]])
Y = torch.tensor([[32.0], [50.0], [68.0], [86.0], [104.0]])
In [17]:
model = nn.Linear(in_features=1, out_features=1)
In [19]:
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)
In [20]:
for epoch in range(2000):
    Y_pred = model(X)

    loss = criterion(Y_pred, Y)

    optimizer.zero_grad()

    loss.backward()

    optimizer.step()

    if epoch % 400 == 0:
        print(f"Epoch {epoch}: loss = {loss.item()}")
Epoch 0: loss = 6039.51318359375
Epoch 400: loss = 199.59164428710938
Epoch 800: loss = 117.13835144042969
Epoch 1200: loss = 68.74734497070312
Epoch 1600: loss = 40.34719467163086
In [23]:
with torch.no_grad():
    X_test = torch.tensor([[100.0]])
    Y_test_pred = model(X_test)
    print("\n--- Результаты обучения ---")
    print(f"Предсказание для 100°C: {Y_test_pred.item():.2f}°F")
    
    # Доступ к обученным весам внутри слоя
    print(f"Итоговый вес W: {model.weight.item():.4f}")
    print(f"Итоговое смещение B: {model.bias.item():.4f}")
--- Результаты обучения ---
Предсказание для 100°C: 231.68°F
Итоговый вес W: 2.0811
Итоговое смещение B: 23.5716
In [ ]: