第9章:机试核心代码填空与编程实战 (NEW & CRITICAL)
你好,未来的研究者!欢迎来到本书最关键的一章。在夏令营的角逐中,理论说得再好,最终也要落实到代码上。“Talk is cheap, show me the code.” 这句话在机试中体现得淋漓尽致。本章将是你从理论到实践的桥梁,也是你决胜机试的秘密武器。
9.1 机试考察的本质:从理论到代码的映射
首先,我们要明确夏令营机试考什么。它不要求你从零搭建一个庞大的系统,而是通过“代码填空”或“模块实现”的形式,精准地考察你对深度学习核心概念的掌握程度。
-
考点映射:
- 你知道“反向传播”,机试就考你
loss.backward()写在哪里。 - 你懂“梯度下降”,机试就考你
optimizer.step()的作用。 - 你理解“残差连接”,机试就让你复现
ResNet的Residual Block。 - 你明白“注意力机制”,机试就让你实现
Self-Attention的核心计算。
- 你知道“反向传播”,机试就考你
-
备考心态:
- 告别“复制粘贴”: 你必须能够理解并独立写出核心模块。
- 形成“肌肉记忆”: 对于经典结构和训练流程,要做到能“白板编程”的程度。
- 重视“张量操作”: PyTorch/TensorFlow的张量维度变换(
view,reshape,permute,transpose)是机试的家常便饭,务必熟练。
现在,让我们开始进入实战区。
9.2 考点一:神经网络的基本组件 (nn.Module, forward)
考点核心: 使用torch.nn.Module构建一个自定义网络,并实现forward传播。这是所有模型搭建的基础。
场景: 实现一个简单的多层感知机(MLP),包含两个全连接层和一个ReLU激活函数。
【代码模板与填空】
import torch
import torch.nn as nn
class SimpleMLP(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
"""
构造函数:定义网络需要的层
"""
super(SimpleMLP, self).__init__()
# =========== TODO: 在这里填空 ===========
# 定义第一个线性层 (输入层 -> 隐藏层)
self.fc1 = nn.Linear(input_dim, hidden_dim)
# 定义激活函数
self.relu = nn.ReLU()
# 定义第二个线性层 (隐藏层 -> 输出层)
self.fc2 = nn.Linear(hidden_dim, output_dim)
# =======================================
def forward(self, x):
"""
前向传播函数:定义数据如何流过网络
"""
# x的初始维度: [batch_size, input_dim]
# =========== TODO: 在这里填空 ===========
# 第一步:通过第一个线性层
out = self.fc1(x)
# out的维度: [batch_size, hidden_dim]
# 第二步:通过激活函数
out = self.relu(out)
# 第三步:通过第二个线性层
out = self.fc2(out)
# out的维度: [batch_size, output_dim]
# =======================================
return out
# --- 如何使用 ---
# 实例化模型
input_size = 784 # 例如: MNIST图像展平后的大小
hidden_size = 256
output_size = 10 # 例如: 10个类别
model = SimpleMLP(input_dim=input_size, hidden_dim=hidden_size, output_dim=output_size)
# 创建一个假的输入张量
dummy_input = torch.randn(64, input_size) # batch_size=64
# 执行前向传播
output = model(dummy_input)
# 打印模型结构和输出维度
print(model)
print("Output shape:", output.shape)
【考点解析】
super(SimpleMLP, self).__init__(): 必须在子类的__init__方法中首先调用父类nn.Module的构造函数,这是PyTorch的规定。- 层的定义位置: 所有的网络层(如
nn.Linear,nn.Conv2d)都必须在__init__方法中定义为类的属性(例如self.fc1),这样PyTorch才能自动追踪到这些层的参数(权重和偏置)。 forward(self, x): 这个函数的名字是固定的。它接收输入张量x,并返回输出张量。你在forward中调用了你在__init__中定义的层。
9.3 考点二:经典模型的核心模块(ResNet残差块,Attention机制)
这两个模块是近年来机试的“明星”,必须能够默写。
1. ResNet残差块 (Residual Block)
考点核心: 理解并实现 H(x)=F(x)+xH(x) = \mathcal{F}(x) + xH(x)=F(x)+x 的思想,特别是当 xxx 和 F(x)\mathcal{F}(x)F(x) 维度不同时的处理方法(1x1卷积)。
【代码模板与填空】
import torch
import torch.nn as nn
class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



