“核心四要素”: 卷积(提取局部特征)、池化(压缩维度/保留关键信息)、全连接(整合全局特征)、激活函数(修正输出)
任务适配逻辑:
输出维度匹配任务(比如分类输出“类别数”),确保模型输出符合要求;
激活函数修正输出(比如分类用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*256
        self.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:128
        self.fc2 = nn.Linear(128, 3)  # 128维→3维(输出维度=类别数,匹配分类任务)输出:size:3

    def forward(self, x):
        # 卷积+激活(ReLU修正输出,引入非线性)
        x = self.pool(F.relu(self.conv1(x)))  # 输入→卷积→ReLU激活→池化 输出:1*16*128*128
        x = self.pool(F.relu(self.conv2(x)))  # 再次卷积→激活→池化 输出:1*32*64*64
        
        # 全连接层:整合特征
        x = x.view(-1, 32 * 64 * 64)  # 展平特征图→一维向量 输出:一维 131072
        x = F.relu(self.fc1(x))  # 全连接→ReLU激活(修正输出)输出:128
        x = self.fc2(x)  # 输出3维结果(未激活,后续用Softmax) 输出:3
        return 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=汽车)")

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐