Advanced
Deep Learning with PyTorch
Build neural networks from scratch with PyTorch — from tensors and autograd to CNNs, transfer learning, and GPU training.
Tensors and Autograd
Python
import torch import torch.nn as nn # Create tensors x = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) x = torch.randn(3, 4) # Random normal x = torch.zeros(2, 3) # Zeros # Autograd - automatic differentiation x = torch.tensor(2.0, requires_grad=True) y = x ** 2 + 3 * x + 1 y.backward() print(x.grad) # dy/dx = 2x + 3 = 7.0
Building a Neural Network
Python
class SimpleNet(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super().__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.dropout = nn.Dropout(0.3) self.fc2 = nn.Linear(hidden_size, num_classes) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.dropout(x) x = self.fc2(x) return x model = SimpleNet(784, 128, 10)
Training Loop
Python
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = model.to(device) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) for epoch in range(10): model.train() for batch_X, batch_y in train_loader: batch_X, batch_y = batch_X.to(device), batch_y.to(device) # Forward pass outputs = model(batch_X) loss = criterion(outputs, batch_y) # Backward pass optimizer.zero_grad() loss.backward() optimizer.step() print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")
DataLoader and Dataset
Python
from torch.utils.data import Dataset, DataLoader class CustomDataset(Dataset): def __init__(self, X, y): self.X = torch.FloatTensor(X) self.y = torch.LongTensor(y) def __len__(self): return len(self.y) def __getitem__(self, idx): return self.X[idx], self.y[idx] dataset = CustomDataset(X_train, y_train) train_loader = DataLoader(dataset, batch_size=32, shuffle=True)
CNN for Image Classification
Python
class CNN(nn.Module): def __init__(self): super().__init__() self.conv_layers = nn.Sequential( nn.Conv2d(1, 32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2) ) self.fc_layers = nn.Sequential( nn.Flatten(), nn.Linear(64 * 7 * 7, 128), nn.ReLU(), nn.Dropout(0.5), nn.Linear(128, 10) ) def forward(self, x): x = self.conv_layers(x) x = self.fc_layers(x) return x
Transfer Learning
Python
from torchvision import models # Load pre-trained ResNet model = models.resnet18(pretrained=True) # Freeze all layers for param in model.parameters(): param.requires_grad = False # Replace final layer for your task model.fc = nn.Linear(model.fc.in_features, num_classes) # Only train the new layer optimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)
Saving and Loading Models
Python
# Save model weights torch.save(model.state_dict(), "model.pth") # Load model weights model = SimpleNet(784, 128, 10) model.load_state_dict(torch.load("model.pth")) model.eval() # Set to evaluation mode
Transfer learning tip: For most image tasks, start with a pre-trained model (ResNet, EfficientNet) and fine-tune it. Training from scratch requires much more data and compute. Transfer learning often achieves better results with less data.