nn.Module 与模型构建
模型前置知识¶
神经网络基础¶
神经网络是一种模仿人类大脑结构的机器学习模型.
通过模拟人脑的学习方式,具有强大的数据拟合和特征学习能力,是深度学习的重要支柱
基本概念¶
| 概念 | 类比 | 功能 | 数学表示 | 常见类型/示例 |
|---|---|---|---|---|
| 神经元 | 生物神经元 | 信息处理的基本单元 | output = activation(∑(weight * input) + bias) | - |
| 权重 连接强度 | 决定输入对输出的影响 | w | - | |
| 偏置 阈值 | 调整神经元输出 | b | - | |
| 激活函数 开关 | 引入非线性 | **Sigmoid, Tanh, ReLU, LeakyReLU, ELU**等 | - | |
| 层 | 楼层 | 信息处理的层次 | 输入层、隐藏层、输出层 | - |
| 输入层 | 接收外界数据,作为神经网络的输入 | |||
| 隐藏层 | 对输入数据进行复杂的**非线性变换,提取特征** | |||
| 输出层 | 输出神经网络的预测结果 |
网络层 layer¶
对于 隐藏层的数量 和 各个隐藏层的节点数: 常见策略是逐层减少节点数
通常,我们选择2的若干次幂作为层的宽度。 因为内存在硬件中的分配和寻址方式,这么做往往可以在计算上更高效。
| 层 | 名称 | 作用 | 概念 |
|---|---|---|---|
| 全连接层 | nn.Linear | 每个神经元与上一层的所有神经元相连。它用于提取特征和进行非线性变换。 | 它的每一个输入都通过矩阵-向量乘法得到它的每个输出。 |
| 激活层 | nn.ReLU | 引入非线性变换 | |
| 批归一化层 | nn.BatchNorm2d | 对每个批次的输入数据进行标准化,减小不同特征的偏差,帮助加速训练并稳定网络。 | |
| dropout层 | nn.Dropout | 随机将一部分神经元的输出设为0 |
| 层 | 名称 | 作用 |
|---|---|---|
| 卷基层 | nn.Conv2d | 通过卷积核对输入数据进行卷积操作,提取局部特征 |
| 池化层 | nn.MaxPool2d | 用于下采样操作,可以减少特征图的尺寸,减少计算量,并防止过拟合。最常见的池化操作是最大池化和平均池化 |
| 循环层 | nn.RNN | 保留历史信息 |
| 自注意力层 | nn.Transformer | 捕捉输入数据中长距离依赖关系 |
模型 model¶
一个模型由1个或多个layer 组成.
sequential¶
Python
from torch import nn
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
自定义复杂逻辑¶
Python
from torch import nn
class FCNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(FCNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
模型参数¶
Python
# 查看参数
<div markdown="1" style="margin-top: -30px; font-size: 0.75em; opacity: 0.7;">
:material-circle-edit-outline: 约 598 个字 :fontawesome-solid-code: 31 行代码 :material-clock-time-two-outline: 预计阅读时间 2 分钟
</div>
model.state_dict()
for name, param in model.named_parameters():
print(name, param.size())
模型参数初始化