深度学习模型架构与训练优化全解析
立即解锁
发布时间: 2025-09-03 00:38:46 阅读量: 10 订阅数: 21 AIGC 


深度学习实战:从零开始
### 深度学习模型架构与训练优化全解析
#### 1. 计算机视觉模型架构
##### 1.1 U - Net架构
U - Net架构左侧是CNN主体(这里是普通CNN,不是ResNet,使用2×2最大池化而非步长为2的卷积,因为它早于ResNet提出),右侧是转置卷积(“上卷积”)层。额外的跳跃连接用从左到右的灰色箭头表示(有时称为交叉连接),因其形状类似字母“U”而得名。转置卷积的输入不仅是前一层的低分辨率网格,还包括ResNet头部的高分辨率网格,这使U - Net能按需利用原始图像的所有信息。不过,U - Net的具体架构依赖于图像大小,fastai有独特的DynamicUnet类,可根据提供的数据自动生成合适大小的架构。
##### 1.2 孪生网络(Siamese Network)
我们可以利用fastai库构建自定义的孪生网络模型并进行训练,步骤如下:
1. **构建模型模块**:
```python
class SiameseModel(Module):
def __init__(self, encoder, head):
self.encoder,self.head = encoder,head
def forward(self, x1, x2):
ftrs = torch.cat([self.encoder(x1), self.encoder(x2)], dim=1)
return self.head(ftrs)
```
2. **创建编码器**:使用`create_body`函数截取预训练模型,对于ResNet,切割值为 - 2。
```python
encoder = create_body(resnet34, cut=-2)
```
3. **创建头部**:编码器最后一层有512个特征,因有两张图像且使用了拼接池化技巧,头部需接收512 * 4个输入。
```python
head = create_head(512*4, 2, ps=0.5)
```
4. **构建模型**:
```python
model = SiameseModel(encoder, head)
```
5. **定义损失函数**:由于目标是布尔值,需将其转换为整数。
```python
def loss_func(out, targ):
return nn.CrossEntropyLoss()(out, targ.long())
```
6. **定义自定义分割器**:将模型分为编码器和头部两个参数组。
```python
def siamese_splitter(model):
return [params(model.encoder), params(model.head)]
```
7. **定义Learner并训练**:
```python
learn = Learner(dls, model, loss_func=loss_func,
splitter=siamese_splitter, metrics=accuracy)
learn.freeze()
learn.fit_one_cycle(4, 3e - 3)
```
训练结果如下:
| epoch | train_loss | valid_loss | accuracy | time |
| --- | --- | --- | --- | --- |
| 0 | 0.367015 | 0.281242 | 0.885656 | 00:26 |
| 1 | 0.307688 | 0.214721 | 0.915426 | 00:26 |
| 2 | 0.275221 | 0.170615 | 0.936401 | 00:26 |
| 3 | 0.223771 | 0.159633 | 0.943843 | 00:26 |
之后解冻模型并使用判别式学习率进行微调:
```python
learn.unfreeze()
learn.fit_one_cycle(4, slice(1e - 6,1e - 4))
```
微调结果如下:
| epoch | train_loss | valid_loss | accuracy | time |
| --- | --- | --- | --- | --- |
| 0 | 0.212744 | 0.159033 | 0.944520 | 00:35 |
| 1 | 0.201893 | 0.159615 | 0.942490 | 00:35 |
| 2 | 0.204606 | 0.152338 | 0.945196 | 00:36 |
| 3 | 0.213203 | 0.148346 | 0.947903 | 00:36 |
#### 2. 自然语言处理(NLP)
将AWD - LSTM语言模型转换为迁移学习分类器的过程与之前使用`cnn_learner`的过程类似。选择语言模型中的堆叠RNN作为编码器,它能为输入的每个单词提供激活值。创建分类器使用“BPTT for Text Classification (BPT3C)”方法:
1. 将文档分成固定大小为b的批次。
2. 每个批次开始时,用前一批次的最终状态初始化模型。
3. 跟踪隐藏状态用于均值和最大池化。
4. 将梯度反向传播到对最终预测有贡献的批次。实际中使用可变长度的反向传播序列。
由于文本长度不同,需要进行填充处理。在抓取一批文本时,找出最长的文本,用特殊标记“xxpad”填充较短的文本。fastai库在创建DataLoaders时会自动处理,确保大小相近的文本放在一起。
#### 3. 表格数据模型(Tabular)
TabularModel的前向传播方法如下:
```p
```
0
0
复制全文
相关推荐










