Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Annotated deep learning paper implementations with code walkthroughs
.claude/skills/brycewang-stanford-deep-learning-papers-guide/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 121% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 176% | 0% |
| case-09 | ✓→✗ | ▼ Worse | 62% | 0% |
Understanding deep learning architectures requires more than reading papers -- it requires reading and writing code. The annotated_deep_learning_paper_implementations repository (65,800+ stars) provides line-by-line annotated implementations of seminal deep learning papers in PyTorch, making it one of the most valuable learning resources in the field.
This guide organizes the key architectures by category, provides implementation patterns for the most important building blocks, and offers strategies for going from paper to working code. Whether you are implementing a Transformer variant for your research, understanding a GAN architecture for your experiments, or teaching a deep learning course, these patterns accelerate the process.
The focus is on practical understanding: what each component does, why it is designed that way, and how to implement it correctly in PyTorch.
The Transformer (Vaswani et al., 2017) is the foundation of modern NLP and increasingly of computer vision.
pythonimport torch import torch.nn as nn import math class MultiHeadAttention(nn.Module): def __init__(self, d_model: int, n_heads: int): super().__init__() assert d_model % n_heads == 0 self.d_model = d_model self.n_heads = n_heads self.d_k = d_model // n_heads self.W_q = nn.Linear(d_model, d_model) self.W_k = nn.Linear(d_model, d_model) self.W_v = nn.Linear(d_model, d_model) self.W_o = nn.Linear(d_model, d_model) def forward(self, query, key, value, mask=None): batch_size = query.size(0) # Linear projections and reshape to (batch, heads, seq, d_k) Q = self.W_q(query).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2) K = self.W_k(key).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2) V = self.W_v(value).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2) # Scaled dot-product attention scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k) if mask is not None: scores = scores.masked_fill(mask == 0, float('-inf')) attn = torch.softmax(scores, dim=-1) context = torch.matmul(attn, V) # Concatenate heads and project context = context.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model) return self.W_o(context)
pythonclass TransformerBlock(nn.Module): def __init__(self, d_model: int, n_heads: int, d_ff: int, dropout: float = 0.1): super().__init__() self.attention = MultiHeadAttention(d_model, n_heads) self.norm1 = nn.LayerNorm(d_model) self.norm2 = nn.LayerNorm(d_model) self.ffn = nn.Sequential( nn.Linear(d_model, d_ff), nn.GELU(), nn.Dropout(dropout), nn.Linear(d_ff, d_model), nn.Dropout(dropout) ) self.dropout = nn.Dropout(dropout) def forward(self, x, mask=None): # Pre-norm variant (used in GPT-2, ViT, modern architectures) attn_out = self.attention(self.norm1(x), self.norm1(x), self.norm1(x), mask) x = x + self.dropout(attn_out) x = x + self.ffn(self.norm2(x)) return x
pythonclass BottleneckBlock(nn.Module): expansion = 4 def __init__(self, in_channels, out_channels, stride=1, downsample=None): super().__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, 1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.conv2 = nn.Conv2d(out_channels, out_channels, 3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) self.conv3 = nn.Conv2d(out_channels, out_channels * self.expansion, 1, bias=False) self.bn3 = nn.BatchNorm2d(out_channels * self.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample def forward(self, x): identity = x out = self.relu(self.bn1(self.conv1(x))) out = self.relu(self.bn2(self.conv2(out))) out = self.bn3(self.conv3(out)) if self.downsample is not None: identity = self.downsample(x) out += identity return self.relu(out)
| Architecture | Year | Parameters | Key Innovation | Primary Domain | |-------------|------|------------|----------------|---------------| | ResNet | 2015 | 25M (ResNet-50) | Skip connections | Vision | | Transformer | 2017 | Varies | Self-attention | NLP | | BERT | 2018 | 340M (Large) | Masked language modeling | NLP | | GPT-2 | 2019 | 1.5B | Autoregressive generation | NLP | | ViT | 2020 | 86M (Base) | Patch-based image tokenization | Vision | | Diffusion | 2020 | Varies | Iterative denoising | Generation | | LLaMA | 2023 | 7B-70B | Efficient open LLM | NLP |
pythondef train_epoch(model, dataloader, optimizer, criterion, device): model.train() total_loss = 0 for batch_idx, (data, targets) in enumerate(dataloader): data, targets = data.to(device), targets.to(device) optimizer.zero_grad() outputs = model(data) loss = criterion(outputs, targets) loss.backward() # Gradient clipping (crucial for Transformers) torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) optimizer.step() total_loss += loss.item() return total_loss / len(dataloader)
python# Cosine annealing with warmup (standard for Transformers) from torch.optim.lr_scheduler import CosineAnnealingLR, LinearLR, SequentialLR optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01) warmup = LinearLR(optimizer, start_factor=0.01, total_iters=1000) cosine = CosineAnnealingLR(optimizer, T_max=50000) scheduler = SequentialLR(optimizer, schedulers=[warmup, cosine], milestones=[1000])
torch.cuda.amp provides 2x speedup with minimal accuracy loss.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 16,973 | 14,348 | -15% | 1 | 1 | 0% | 3,626 | 4,622 | +27% | 0 | 0 | — |
case-02 | fail→fail | 27,629 | 41,149 | +49% | 1 | 1 | 0% | 4,660 | 10,085 | +116% | 0 | 0 | — |
case-03 | fail→fail | 17,629 | 12,024 | -32% | 1 | 1 | 0% | 3,599 | 4,831 | +34% | 0 | 0 | — |
case-04 | pass→pass | 12,668 | 14,056 | +11% | 1 | 1 | 0% | 2,718 | 5,302 | +95% | 0 | 0 | — |
case-05 | pass→pass | 14,730 | 12,713 | -14% | 1 | 1 | 0% | 2,910 | 4,930 | +69% | 0 | 0 | — |
case-06 | pass→pass | 8,706 | 3,653 | -58% | 1 | 1 | 0% | 1,512 | 2,951 | +95% | 0 | 0 | — |
case-07 | pass→pass | 9,007 | 4,816 | -47% | 1 | 1 | 0% | 1,514 | 3,167 | +109% | 0 | 0 | — |
case-08 | fail→pass | 9,265 | 5,927 | -36% | 1 | 1 | 0% | 1,471 | 3,252 | +121% | 0 | 0 | — |
case-09 | pass→fail | 15,207 | 11,509 | -24% | 1 | 1 | 0% | 2,794 | 4,530 | +62% | 0 | 0 | — |
case-10 | pass→pass | 6,788 | 3,579 | -47% | 1 | 1 | 0% | 1,256 | 2,931 | +133% | 0 | 0 | — |
case-11 | fail→fail | 11,785 | 15,071 | +28% | 1 | 1 | 0% | 2,398 | 5,368 | +124% | 0 | 0 | — |
case-12 | pass→pass | 8,050 | 7,871 | -2% | 1 | 1 | 0% | 1,431 | 3,679 | +157% | 0 | 0 | — |
case-13 | pass→pass | 9,304 | 9,359 | +1% | 1 | 1 | 0% | 1,873 | 4,166 | +122% | 0 | 0 | — |
case-14 | pass→pass | 5,181 | 22,053 | +326% | 1 | 1 | 0% | 877 | 2,893 | +230% | 0 | 0 | — |
case-15 | pass→pass | 8,077 | 2,843 | -65% | 1 | 1 | 0% | 1,446 | 2,859 | +98% | 0 | 0 | — |
case-16 | pass→pass | 13,766 | 8,701 | -37% | 1 | 1 | 0% | 2,028 | 3,696 | +82% | 0 | 0 | — |
case-17 | pass→pass | 7,579 | 9,977 | +32% | 1 | 1 | 0% | 1,381 | 4,118 | +198% | 0 | 0 | — |
case-18 | fail→pass | 10,580 | 3,468 | -67% | 1 | 1 | 0% | 1,856 | 2,886 | +55% | 0 | 0 | — |
case-19 | pass→pass | 16,830 | 21,224 | +26% | 1 | 1 | 0% | 2,722 | 6,092 | +124% | 0 | 0 | — |
case-20 | pass→pass | 3,208 | 1,784 | -44% | 1 | 1 | 0% | 454 | 2,557 | +463% | 0 | 0 | — |
case-21 | pass→pass | 8,695 | 3,118 | -64% | 1 | 1 | 0% | 1,437 | 2,817 | +96% | 0 | 0 | — |
case-22 | fail→pass | 6,100 | 2,211 | -64% | 1 | 1 | 0% | 963 | 2,662 | +176% | 0 | 0 | — |
case-23 | pass→pass | 13,742 | 17,757 | +29% | 1 | 1 | 0% | 2,534 | 5,820 | +130% | 0 | 0 | — |
case-24 | pass→pass | 20,610 | 22,546 | +9% | 1 | 1 | 0% | 3,996 | 6,533 | +63% | 0 | 0 | — |
case-25 | pass→pass | 14,332 | 15,075 | +5% | 1 | 1 | 0% | 2,813 | 5,284 | +88% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +12 percentage points is the difference between those two pass rates over the 25 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.