Files
Karpathy_ZtH_Learning/My_Experiments/pytorch3.ipynb
T
2026-07-04 21:14:40 +03:00

11 KiB

Manual approach

In [22]:
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 [23]:
W = torch.randn((1, 1), requires_grad=True)
B = torch.randn((1, 1), requires_grad=True)
In [24]:
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 = 10481.2871
Epoch 400: Loss = 207.9038
Epoch 800: Loss = 122.0165
Epoch 1200: Loss = 71.6102
Epoch 1600: Loss = 42.0273
Epoch 2000: Loss = 24.6654
Epoch 2400: Loss = 14.4759
Epoch 2800: Loss = 8.4958
Epoch 3200: Loss = 4.9861
Epoch 3600: Loss = 2.9263
Epoch 4000: Loss = 1.7174
Epoch 4400: Loss = 1.0079
Epoch 4800: Loss = 0.5916
Epoch 5200: Loss = 0.3472
Epoch 5600: Loss = 0.2038
Epoch 6000: Loss = 0.1196
Epoch 6400: Loss = 0.0702
Epoch 6800: Loss = 0.0412
Epoch 7200: Loss = 0.0242
Epoch 7600: Loss = 0.0142
Epoch 8000: Loss = 0.0083
Epoch 8400: Loss = 0.0049
Epoch 8800: Loss = 0.0029
Epoch 9200: Loss = 0.0017
Epoch 9600: Loss = 0.0010
Epoch 10000: Loss = 0.0006
Epoch 10400: Loss = 0.0003
Epoch 10800: Loss = 0.0002
Epoch 11200: Loss = 0.0001
Epoch 11600: Loss = 0.0001
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 [25]:
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: 212.00°F (Ожидалось: 212.00)
Итоговый вес W: 1.8000 (Ожидалось: 1.8)
Итоговое смещение B: 31.9986 (Ожидалось: 32.0)

Professional approach

In [26]:
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 [27]:
model = nn.Linear(in_features=1, out_features=1)
In [28]:
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)
In [29]:
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 = 5640.71875
Epoch 400: loss = 197.63983154296875
Epoch 800: loss = 115.99267578125
Epoch 1200: loss = 68.0748291015625
Epoch 1600: loss = 39.95244598388672
In [30]:
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.59°F
Итоговый вес W: 2.0797
Итоговое смещение B: 23.6129
In [31]:
import torch
import torch.nn as nn
import torch.optim as optim

# 1. Define the MLP model
class SimpleMLP(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleMLP, self).__init__()
        # First linear layer: input to hidden layer
        self.fc1 = nn.Linear(input_size, hidden_size)
        # Second linear layer: hidden layer to output layer
        self.fc2 = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        # Apply ReLU activation function
        x = torch.relu(self.fc1(x))
        # Output layer (no activation for regression or logits)
        x = self.fc2(x)
        return x

# 2. Setup parameters
input_size = 784  # Example: Flattened MNIST image (28*28)
hidden_size = 128
output_size = 10 # Example: Number of classes for classification

# Initialize the model
model = SimpleMLP(input_size, hidden_size, output_size)
print("--- MLP Model Architecture ---")
print(model)

# 3. Create dummy data for demonstration (In a real scenario, you would load a dataset like MNIST)
# Batch size and input features
batch_size = 64
dummy_input = torch.randn(batch_size, input_size)
# Dummy labels
dummy_target = torch.randint(0, output_size, (batch_size,))

# 4. Setup Loss Function and Optimizer
criterion = nn.CrossEntropyLoss()  # Suitable for multi-class classification
optimizer = optim.Adam(model.parameters(), lr=0.001)

print("\n--- Starting Training Simulation ---")

# 5. Training Loop (Simulation)
num_epochs = 5

for epoch in range(num_epochs):
    # Forward pass
    outputs = model(dummy_input)
    
    # Calculate loss
    loss = criterion(outputs, dummy_target)
    
    # Backward pass and optimization
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

print("\nMLP Example successfully defined and simulated training steps.")
--- MLP Model Architecture ---
SimpleMLP(
  (fc1): Linear(in_features=784, out_features=128, bias=True)
  (fc2): Linear(in_features=128, out_features=10, bias=True)
)

--- Starting Training Simulation ---
Epoch [1/5], Loss: 2.3642
Epoch [2/5], Loss: 2.0382
Epoch [3/5], Loss: 1.7581
Epoch [4/5], Loss: 1.5167
Epoch [5/5], Loss: 1.3047

MLP Example successfully defined and simulated training steps.
In [32]:
import torch
from torch import nn
from matplotlib import pyplot as plt
In [ ]:
X_test = torch.tensor(
In [ ]:


class Model(nn.Module):
    def __init__(self):
        super().__init__()
        
In [ ]:
In [ ]: