IT评测·应用市场-qidao123.com技术社区

标题: DAY07:【pytorch】模型构建 [打印本页]

作者: 南飓风    时间: 2025-4-15 11:26
标题: DAY07:【pytorch】模型构建
一、引言

在机器学习的练习流程中,模型构建是核心环节之一。从传统机器学习的线性模型到深度学习的神经网络,模型的复杂度呈指数级增长。PyTorch 作为主流深度学习框架,通过nn.Module类提供了同一的模型构建接口,使得复杂网络结构的界说与管理变得高效且规范。
二、三要素

2.1 网络层构建

深度学习模型的底子是各类网络层,常见范例包罗:

2.2 网络拼接

以 LeNet 为例,其网络结构可拆解为:
  1. 输入`32x32x3`
  2. → Conv1(6核,5x5,步长1)
  3. → 输出`28x28x6`
  4. → MaxPool1(2x2,步长2)
  5. → 输出`14x14x6`
  6. → Conv2(16核,5x5,步长1)
  7. → 输出`10x10x16`
  8. → MaxPool2(2x2,步长2)
  9. → 输出`5x5x16`
  10. → 展平为400维
  11. → Fc1(400→120)
  12. → Fc2(120→84)
  13. → Fc3(84→10)
  14. → Softmax输出
复制代码
2.3 权值初始化

公道的初始化可制止梯度消失/爆炸,常见方法:

三、nn.Module

3.1 两大要素

每个自界说模型需继承nn.Module,并实现两大核心方法:
代码示例:LeNet 模型界说
  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. class LeNet(nn.Module):
  5.     def __init__(self):
  6.         super(LeNet, self).__init__()
  7.         # 卷积层与池化层
  8.         self.conv1 = nn.Conv2d(3, 6, 5)  # 输入3通道,输出6通道,5x5卷积核
  9.         self.conv2 = nn.Conv2d(6, 16, 5)
  10.         self.pool = nn.MaxPool2d(2, 2)  # 2x2池化,步长2
  11.         # 全连接层
  12.         self.fc1 = nn.Linear(16*5*5, 120)  # 5x5是池化后尺寸(10/2=5)
  13.         self.fc2 = nn.Linear(120, 84)
  14.         self.fc3 = nn.Linear(84, 10)
  15.    
  16.     def forward(self, x):  # x形状:(batch_size, 3, 32, 32)
  17.         x = self.pool(F.relu(self.conv1(x)))  # (6, 28, 28) → (6, 14, 14)
  18.         x = self.pool(F.relu(self.conv2(x)))  # (16, 10, 10) → (16, 5, 5)
  19.         x = x.view(-1, 16*5*5)  # 展平为批量维度+特征维度
  20.         x = F.relu(self.fc1(x))
  21.         x = F.relu(self.fc2(x))
  22.         x = self.fc3(x)  # 输出logits,Softmax在损失函数中处理
  23.         return x
复制代码
3.2 四大属性

nn.Module通过8个OrderedDict管理内部状态,核心属性包罗:
四、进阶本领

4.1 层次化计划:子模块复用

复杂模型(如 ResNet)通过界说子模块(如残差块)提拔代码复用性:
  1. class ResidualBlock(nn.Module):
  2.     def __init__(self, in_channels, out_channels, stride=1):
  3.         super().__init__()
  4.         self.conv1 = nn.Conv2d(in_channels, out_channels, 3, stride, 1, bias=False)
  5.         self.bn1 = nn.BatchNorm2d(out_channels)
  6.         self.conv2 = nn.Conv2d(out_channels, out_channels, 3, 1, 1, bias=False)
  7.         self.bn2 = nn.BatchNorm2d(out_channels)
  8.         self.shortcut = nn.Sequential()
  9.         if stride != 1 or in_channels != out_channels:
  10.             self.shortcut = nn.Sequential(
  11.                 nn.Conv2d(in_channels, out_channels, 1, stride, bias=False),
  12.                 nn.BatchNorm2d(out_channels)
  13.             )
  14.    
  15.     def forward(self, x):
  16.         out = F.relu(self.bn1(self.conv1(x)))
  17.         out = self.bn2(self.conv2(out))
  18.         out += self.shortcut(x)
  19.         return F.relu(out)
复制代码
4.2 动态外形处理:制止硬编码尺寸

在forward中通过x.shape动态获取维度,提拔模型通用性(如支持不同输入尺寸的图像)。
4.3 混合使用nn.Module与nn.functional


五、注意事项


微语录:不要由于走得太远,而忘记为什么出发。— — 卡里·纪伯伦

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4