深度学习模型构建的本质——“核心四要素+任务适配逻辑”
“核心四要素”: 卷积(提取局部特征)、池化(压缩维度/保留关键信息)、全连接(整合全局特征)、激活函数(修正输出)
任务适配逻辑:
输出维度匹配任务(比如分类输出“类别数”),确保模型输出符合要求;
激活函数修正输出(比如分类用softmax, 回归用Linear), 让输出符合任务逻辑(概率/数值);
损失函数引导学习(比如分类用交叉熵,回归用CloU),通过梯度下降让模型不断逼近“正确答案”。
即使是复杂的Transformer、ViT等模型,本质上也是在这个逻辑上做了“组件升级”(比如用自注意力替代部分卷积),但“输出维度、激活函数、损失函数适配任务”的核心逻辑从未变过。
以下用 “图像分类(区分猫 / 狗 / 汽车 3 类)” 任务,把上面提到的核心要素串成完整流程,直观展示各部分如何配合工作。
import torch
import torch.nn as nn
import torch.nn.functional as F# 1. 用“卷积+池化+全连接”搭网络框架(基础组件)
class SimpleImageClassifier(nn.Module):def __init__(self):super().__init__()# 卷积+池化:提取图像局部特征(如边缘、纹理)self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1) # 3通道→16通道 输出:1*16*256*256self.pool = nn.MaxPool2d(2) # 下采样:尺寸减半,压缩维度 输出:1*16*128*128 self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1) # 16通道→32通道 输出:1*32*128*128# 全连接:整合全局特征,输出匹配任务的维度self.fc1 = nn.Linear(32 * 64 * 64, 128) # 卷积输出→128维(中间层)输出:size:128self.fc2 = nn.Linear(128, 3) # 128维→3维(输出维度=类别数,匹配分类任务)输出:size:3def forward(self, x):# 卷积+激活(ReLU修正输出,引入非线性)x = self.pool(F.relu(self.conv1(x))) # 输入→卷积→ReLU激活→池化 输出:1*16*128*128x = self.pool(F.relu(self.conv2(x))) # 再次卷积→激活→池化 输出:1*32*64*64# 全连接层:整合特征x = x.view(-1, 32 * 64 * 64) # 展平特征图→一维向量 输出:一维 131072x = F.relu(self.fc1(x)) # 全连接→ReLU激活(修正输出)输出:128x = self.fc2(x) # 输出3维结果(未激活,后续用Softmax) 输出:3return x# 2. 定义“损失函数”引导学习(分类任务用交叉熵损失)
criterion = nn.CrossEntropyLoss() #结合热编码label:[0,1,0] output:[0.34,0.36,0.30]
#loss = 0*log(0.34)+1*log(0.36)+0*log(0.3)# 3. 模拟训练流程(核心要素协作)
if __name__ == "__main__":# 模拟输入:1张3通道RGB图(尺寸256×256),标签“1”(代表“狗”,0=猫/1=狗/2=汽车)input_img = torch.randn(1, 3, 256, 256) # [batch, 通道, 高, 宽]label = torch.tensor([1], dtype=torch.long) # 真实标签# 初始化模型和优化器(梯度下降的执行者)model = SimpleImageClassifier()optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 一次训练迭代(完整流程)optimizer.zero_grad() # 清空梯度output = model(input_img) # 模型前向传播:输出3维结果(如[0.2, 0.5, 0.3])loss = criterion(output, label) # 计算损失:衡量预测与真实的差距loss.backward() # 反向传播:计算梯度optimizer.step() # 梯度下降:更新模型参数,让下次预测更准# 查看最终分类结果(激活函数修正输出为概率)pred_prob = F.softmax(output, dim=1) # Softmax激活:转化为0~1的类别概率pred_class = torch.argmax(pred_prob, dim=1) # 取概率最大的类别print(f"预测类别概率:{pred_prob.detach().numpy()}") # 如[0.2, 0.6, 0.2]print(f"预测类别:{pred_class.item()}(0=猫/1=狗/2=汽车)")