Laboratory Task 4

Laboratory Task 4#


Instruction: Train a linear regression model in PyTorch using a regression dataset. Use the following parameters:

  • Criterion: MSE Loss

  • Fully Connected Layers x 2

  • Batch Size: 8

  • Optimizer: SGD

  • Epoch: 1000

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# Generate and scale dataset
X, y = make_regression(n_samples=200, n_features=1, noise=15, random_state=42)

scaler_X = StandardScaler()
scaler_y = StandardScaler()

X = scaler_X.fit_transform(X)
y = scaler_y.fit_transform(y.reshape(-1, 1))

X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# DataLoader
batch_size = 8
train_dataset = torch.utils.data.TensorDataset(X_train, y_train)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

# Model
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(1, 8)
        self.fc2 = nn.Linear(8, 1)
    
    def forward(self, x):
        x = self.fc1(x)
        x = self.fc2(x)
        return x

model = LinearRegressionModel()

# Loss and Optimizer
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# Training Loop
epochs = 1000
losses = []

for epoch in range(epochs):
    for inputs, targets in train_loader:
        outputs = model(inputs)
        loss = criterion(outputs, targets)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
    losses.append(loss.item())
    if (epoch + 1) % 100 == 0:
        print(f"Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.6f}")

# Evaluate
model.eval()
with torch.no_grad():
    preds = model(X_test)
    test_loss = criterion(preds, y_test)
print(f"\nTest MSE Loss: {test_loss.item():.6f}")

# Plot training loss
plt.plot(losses)
plt.title("Training Loss over Epochs")
plt.xlabel("Epoch")
plt.ylabel("MSE Loss")
plt.show()
Epoch [100/1000], Loss: 0.032932
Epoch [200/1000], Loss: 0.017936
Epoch [300/1000], Loss: 0.052685
Epoch [400/1000], Loss: 0.031972
Epoch [500/1000], Loss: 0.042977
Epoch [600/1000], Loss: 0.007942
Epoch [700/1000], Loss: 0.051016
Epoch [800/1000], Loss: 0.038607
Epoch [900/1000], Loss: 0.025595
Epoch [1000/1000], Loss: 0.036139

Test MSE Loss: 0.038352
../_images/0af7c9a1e9e2f5cb03d7da8e0878e1e763de724099d548671c54b6fc671750d1.png