编辑
2026-06-27
神经网络
00

目录

一、全连接层在算什么?
二、为什么必须加激活函数?
三、训练五步骨架(雷打不动)

image.png

一、全连接层在算什么?

一个 nn.Linear(in, out) 就是一次矩阵运算:

y=Wx+b\mathbf{y} = \mathbf{W}\mathbf{x} + \mathbf{b}

  • x\mathbf{x}:输入(in 维)
  • W\mathbf{W}:权重矩阵(out × in),要学习
  • b\mathbf{b}:偏置(out 维),要学习
  • y\mathbf{y}:输出(out 维)

单个神经元展开

y=w1x1+w2x2++wnxn+by = w_1x_1 + w_2x_2 + \dots + w_nx_n + b

验证:nn.Linear(1,32)weight.shape = (32,1)bias.shape = (32,), 正好把 1 维输入升到 32 维。

二、为什么必须加激活函数?

只堆 Wx+b,无论多少层,本质还是线性(矩阵连乘还是一个矩阵), 画不出 sin 这样的弯曲曲线。

加 ReLU 引入非线性:

ReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x)

多层 + 非线性 → 能拟合任意复杂函数(万能逼近定理)。

下面为神经网络基本框架

python
class MLP(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(1, 32) self.fc2 = nn.Linear(32, 32) self.fc3 = nn.Linear(32, 1) def forward(self, x): x = torch.relu(self.fc1(x)) # 线性 + 非线性 x = torch.relu(self.fc2(x)) return self.fc3(x) # 回归任务最后一层不加激活

三、训练五步骨架(雷打不动)

python
for epoch in range(1000): optimizer.zero_grad() # 1. 清空上轮梯度(梯度会累加,不清会错) pred = model(x) # 2. 前向(自动调用 forward) loss = criterion(pred, y) # 3. 算误差 loss.backward() # 4. 反向(autograd 自动算所有梯度) optimizer.step() # 5. 按梯度更新参数 # 上述的代码是全批量训练的,因为数据量小

以上就是神经网络训练的基本流程了,后续会根据不同的任务更新不同的算法,敬请期待~

本文作者:Deshill

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!