☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

如果您希望从零开始训练一个ResNet结构用于图像分类任务,而非调用预训练权重,需完整经历数据准备、模型构建、训练循环与评估等环节。以下是实现该目标的具体路径:
一、准备标注图像数据集
训练ResNet必须依赖带标签的图像集合,其组织结构直接影响模型收敛性与泛化能力。数据应划分为训练集、验证集和测试集,并确保类别分布均衡。
1、创建目录结构:在项目根目录下新建dataset/文件夹,内部按类别建立子文件夹,例如:dataset/train/cat/、dataset/train/dog/、dataset/val/cat/、dataset/test/dog/。
2、将原始图像按类别放入对应子目录,每类至少包含200张以上图像以保障基础训练效果。
3、使用torchvision.datasets.ImageFolder自动读取并构建数据集对象,该接口会依据子目录名自动生成类别索引映射。
二、构建可训练的ResNet-18模型
PyTorch不提供“从零初始化”的ResNet变体接口,需手动定义网络结构,禁用预训练权重加载,确保所有参数均为随机初始化状态。
1、导入必需模块:import torch.nn as nn、from torch.nn import functional as F、import torch。
2、定义BasicBlock类:包含两个3×3卷积层、BatchNorm2d及残差连接逻辑,其中downsample分支在通道数变化时启用1×1卷积升维。
3、定义ResNet类:设置初始卷积层(7×7)、最大池化层,随后堆叠4个残差块组([2,2,2,2]),最后接全局平均池化与全连接层;关键操作:不传入pretrained=True参数,且显式调用nn.init.kaiming_normal_对各卷积核与全连接层权重进行初始化。
三、配置训练环境与超参数
训练稳定性高度依赖优化器选择、学习率策略与损失函数设计,尤其在无预训练权重前提下更需谨慎设置起始学习率与正则强度。
1、设定设备:执行device = torch.device("cuda" if torch.cuda.is_available() else "cpu"),并将模型移至对应设备。
2、定义损失函数:criterion = nn.CrossEntropyLoss(label_smoothing=0.1),启用标签平滑缓解过拟合。
3、选用SGD优化器:optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4);注意:初始学习率设为0.1而非常用0.001,因ResNet深层结构需更强梯度激励才能启动有效更新。
4、添加学习率衰减:scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1),每30轮将学习率缩小为十分之一。
四、编写训练与验证主循环
训练过程需交替执行前向传播、损失计算、反向传播与参数更新,并同步在验证集上监控准确率变化,防止训练失控。
1、外层循环遍历epoch,内层使用DataLoader加载batch数据,输入形状应为[N, 3, 224, 224]。
2、训练阶段:清空梯度optimizer.zero_grad(),执行model(inputs)获取logits,计算损失后调用loss.backward()与optimizer.step()。
3、验证阶段:禁用梯度计算torch.no_grad(),统计每个batch预测正确的样本数,累加后除以总样本数得当前验证准确率。
4、每轮结束后调用scheduler.step()更新学习率,并打印训练损失与验证准确率数值。
五、保存最佳模型权重
在训练过程中持续跟踪验证集最高准确率,仅当当前轮次准确率超过历史最优值时,才将模型参数序列化保存至磁盘,避免覆盖更优状态。
1、初始化变量best_acc = 0.0,并在每个epoch验证结束后比较current_acc > best_acc。
2、若条件成立,执行torch.save(model.state_dict(), "resnet18_from_scratch_best.pth")。
3、同时保存优化器状态以便后续断点续训:torch.save({"model": model.state_dict(), "optimizer": optimizer.state_dict(), "epoch": epoch}, "checkpoint.pth")。








