深度学习:完整的模型训练流程

embedded/2024/11/29 20:41:00/

深度学习:完整的模型训练流程

为了确保我们提供一个彻底和清晰的指导,让我们深入分析在model.pytrain.py文件中定义的模型训练和验证流程。以下部分将详细讨论模型结构的定义、数据的加载与预处理、训练参数的配置、训练与测试循环,以及模型的保存和性能监控。此外,我们将通过具体代码示例,详尽解释每个环节的执行逻辑和目的,从而确保您能够有效地理解并应用这些步骤以优化您的深度学习项目。

1. 模型结构定义(model.py

目的和结构

model.py中定义的My_Network类基于PyTorch的torch.nn.Module。这个类的设计使模型能够集成并利用PyTorch提供的多种深度学习功能,从而实现有效的图像分类。

class My_Network(nn.Module):def __init__(self):super(My_Network, self).__init__()# 创建序列模型self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),  # 第一层卷积层nn.ReLU(),                  # 激活函数nn.MaxPool2d(2),            # 池化层nn.Conv2d(32, 32, 5, 1, 2), # 第二层卷积层nn.ReLU(),                  nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2), # 第三层卷积层nn.ReLU(),nn.MaxPool2d(2),nn.Flatten(),               # 展平层nn.Linear(64*4*4, 64),      # 全连接层nn.ReLU(),nn.Linear(64, 10)           # 输出层)def forward(self, x):return self.model(x)
注释解释
  • 卷积层:使用3通道输入,利用5x5的卷积核来提取特征,步长为1,填充为2以保持图像尺寸。
  • ReLU激活函数:引入非线性,帮助网络学习复杂的模式。
  • 池化层:使用2x2的窗口减小特征维度,同时保留重要的特征信息,减少计算量并防止过拟合。
  • 展平层与全连接层:将二维特征图转换为一维特征向量,通过全连接层进行分类。

2. 数据加载与预处理

实现细节

使用PyTorch的torchvision.datasets库来加载和预处理CIFAR-10数据集。

train_data = torchvision.datasets.CIFAR10(root="../dataset", train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_data = torchvision.datasets.CIFAR10(root="../dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
预处理功能
  • ToTensor():将图片数据转换为Tensor,并归一化到[0,1]范围。
  • Normalize():通常在此步骤中加入标准化处理,但在这里简化为基本的Tensor转换。

3. 训练和测试循环

配置和流程

设置训练环境,包括数据加载器、损失函数和优化器,定义训练和测试过程。

# 设置数据加载器
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = DataLoader(test_data, batch_size=64, shuffle=False)# 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(my_network.parameters(), lr=0.01)
训练和测试代码
for epoch in range(10):  # 进行10个训练周期my_network.train()  # 设置为训练模式for imgs, targets in train_loader:outputs = my_network(imgs)loss = loss_fn(outputs, targets)optimizer.zero_grad()loss.backward()optimizer.step()# 测试模式my_network.eval()total_accuracy = 0with torch.no_grad():for imgs, targets in test_loader:outputs = my_network(imgs)total_accuracy += (outputs.argmax(1) == targets).sum().item()print(f"Epoch {epoch+1}: Accuracy = {total_accuracy / len(test_data)}")

4. 模型保存和日志记录

保存策略和性能监控

在每个训练周期后保存模型的状态,并使用TensorBoard来记录关键的训练和测试指标。

torch.save(my_network.state_dict(), f"my_network_epoch_{epoch}.pth")
writer.add_scalar("Loss/train", loss.item(), epoch)
writer.add_scalar("Accuracy/test", total_accuracy / len(test_data), epoch)
解释
  • 模型保存:定期保存训练后的模型状态,以便进行未来的训练或评估。
  • 性能监控:使用TensorBoard记录训练损失和测试准确率,帮助监控模型的学习进度和性能。

通过这种详尽的分析,每个步骤的实现和逻辑都被清晰地展示和解释,确保模型训练和验证的每个关键考量都被适当地处理。这为深入理解和优化深度学习模型提供了坚实的基础。


http://www.ppmy.cn/embedded/141571.html

相关文章

2024年12月计划(ue5太阳系+ue独立游戏+freex+GPU精粹泛读催眠)

根据以往, 如果周一到周四白天 一,UE5太阳系每天一节,原因是尽可能地接手外包的源码,全职去做UE,提高核心竞争力。剩下26节,868分钟。如果按照每天10分钟,显然是不够的。分5周进行,…

Elasticsearch:Retrievers 介绍

检索器(retrievers)是 Elasticsearch 中搜索 API 中添加的新抽象层。它们提供了在单个 _search API 调用中配置多阶段检索管道的便利。此架构通过消除对复杂搜索查询的多个 Elasticsearch API 调用的需求,简化了应用程序中的搜索逻辑。它还减…

pico-sdk(八)-程序架构之自定义预处理变量

pico-sdk(八)-程序架构之自定义预处理变量 Board 配置文件中的预处理变量CMake 中的预处理变量 SDK可以使用编译时定义来配置库的行为和功能,能够对那些不太可能在运行时更改的配置(例如物理引脚)进行设置。这样做可以…

python-解决一元一次方程

【题目】解决一元一次方程数学问题 【问题描述】 我们要解决一个较为复杂的一元一次方程数学问题,方程形如:ax b c,其中a、b、c为已知常数,x为未知数。 现在我们要通过编程的方式解决这个问题,即找到方程的解x。 【…

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本: 脚本已和当前文章绑定,请移步下载(免费!免费!免费!) (单纯的分享!) 步骤: 将文件/内容上传到终端中 …

python代码示例(读取excel文件,自动播放音频)

目录 python 操作excel 表结构 安装第三方库 代码 自动播放音频 介绍 安装第三方库 代码 python 操作excel 表结构 求出100班同学的平均分 安装第三方库 因为这里的表结构是.xlsx文件,需要使用openpyxl库 如果是.xls格式文件,需要使用xlrd库 pip install openpyxl /…

Ubuntu EFI分区扩容

1.扩容原因 Ubuntu安装时默认将EFI设置为单独分区,原来EFI分区分配容量为100M,在经历一次BIOS和Firmware更新之后,占用量达到了70多M,所以选择扩容。 2.扩容踩坑 我的操作: 将Gparted工具制作为启动盘,…

力扣—912. 排序数组

912. 排序数组 题目: 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例: 示例 1: 输入:nums …