福州网站建设策划方案,清河网站建设价格,如果让你建设一个网站,深圳高端网站建设模版文章目录 ResNet网络ResNet网络实例导入所需库下载训练数据和测试数据设置每个批次的样本个数判断是否使用GPU定义残差模块定义ResNet网络模型导入GPU定义训练函数定义测试函数创建损失函数和优化器训练测试数据结果 ResNet网络
ResNet#xff08;Residual Network#xff0… 文章目录 ResNet网络ResNet网络实例导入所需库下载训练数据和测试数据设置每个批次的样本个数判断是否使用GPU定义残差模块定义ResNet网络模型导入GPU定义训练函数定义测试函数创建损失函数和优化器训练测试数据结果 ResNet网络
ResNetResidual Network残差网络是深度学习领域中非常重要且具有影响力的一种卷积神经网络CNN架构由何恺明等人于 2015 年提出在图像识别、目标检测等诸多计算机视觉任务中取得了巨大成功。 1. 产生背景在深度学习发展过程中随着网络深度的增加会出现梯度消失或梯度爆炸的问题导 致网络难以训练。即使通过归一化等方法解决了梯度问题还会面临退化问题即网络深度增加时模型的训 练误差和测试误差反而增大。ResNet 的提出就是为了解决深度神经网络中的退化问题。
ResNet-18是 ResNet 家族中相对较浅的网络由 4 个残差块组构成每个残差块组包含不同数量的残差块。它的结构简单计算量相对较小适合计算资源有限或对模型复杂度要求不高的场景如一些小型图像数据集的分类任务。它在一些对实时性要求较高的应用中如移动设备上的图像识别也有一定的应用。ResNet-34同样由 4 个残差块组组成但相比 ResNet-18它在某些残差块组中包含更多的残差块网络深度更深因此能够学习到更复杂的特征表示。它在中等规模的图像数据集上表现良好在一些对模型性能有一定要求但又不过分追求极致精度的任务中较为常用。ResNet-50是一个比较常用的 ResNet 模型在许多计算机视觉任务中都有广泛应用。它使用了瓶颈结构Bottleneck的残差块这种结构通过先降维、再卷积、最后升维的方式在减少计算量的同时保持了模型的表达能力。该模型在图像分类、目标检测、语义分割等任务中都能作为性能不错的骨干网络为后续的任务提供有效的特征提取。ResNet-101比 ResNet-50 的网络层数更多拥有更强大的特征提取能力。它适用于大规模图像数据集和复杂的计算机视觉任务如在大型目标检测数据集中能够更好地捕捉目标的细节特征提升检测的准确性。由于其深度和复杂度在处理高分辨率图像或需要精细特征表示的任务时表现出色。ResNet-152是 ResNet 系列中深度较深的网络具有极高的特征提取能力。但由于其深度很大计算量和参数量也相应增加训练和推理所需的时间和资源较多。它通常用于对精度要求极高的场景如学术研究中的图像识别挑战、大规模图像搜索引擎的图像特征提取等。 18层残差网络 ResNet网络实例 项目需求对手写数字进行识别。 数据集此项目数据集来自MNIST 数据集由美国国家标准与技术研究所NIST整理而成包含手写数字的图像主要用于数字识别的训练和测试。该数据集被分为两部分训练集和测试集。训练集包含 60,000 张图像用于模型的学习和训练测试集包含 10,000 张图像用于评估训练好的模型在未见过的数据上的性能。 图像格式数据集中的图像是灰度图像即每个像素只有一个值表示其亮度取值范围通常为 0黑色到 255白色。 图像尺寸每张图像的尺寸为 28x28 像素总共有 784 个像素点。 标签信息每个图像都有一个对应的标签标签是 0 到 9 之间的整数表示图像中手写数字的值。 导入所需库
import torch
from torch import nn # 导入神经网络模块
from torch.utils.data import DataLoader # 数据包管理工具打包数据
from torchvision import datasets # 封装了很对与图像相关的模型数据集
from torchvision.transforms import ToTensor # 数据转换张量将其他类型的数据转换成tensor张量
import torch.nn.functional as F # 用于应用 ReLU 激活函数下载训练数据和测试数据
下载训练数据集(包含训练集图片标签)
training_data datasets.MNIST( # 跳转到函数的内部源代码pycharm 按下ctrl鼠标点击rootdata, # 表示下载的手写数字 到哪个路径。60000trainTrue, # 读取下载后的数据中的数据集downloadTrue, # 如果你之前已经下载过了就不用再下载了transformToTensor(), # 张量图片是不能直接传入神经网络模型# 对于pytorch库能够识别的数据一般是tensor张量
)下载测试数据集包含训练图片标签
test_data datasets.MNIST(rootdata,trainFalse,downloadTrue,transformToTensor(), # Tensor是在深度学习中提出并广泛应用的数据类型它与深度学习框架如pytorchTensorFlow
) # numpy数组只能在cpu上运行。Tensor可以在GPU上运行这在深度学习应用中可以显著提高计算速度。
print(len(training_data))
print(len(test_data))设置每个批次的样本个数
train_dataloader DataLoader(training_data, batch_size64) # 建议用2的指数当作一个包的数量
test_dataloader DataLoader(test_data, batch_size64)判断是否使用GPU
判断是否支持GPU
device cuda if torch.cuda.is_available() else mps if torch.backends.mps.is_available() else cpu
print(fUsing {device} device)定义残差模块
# 定义残差块类继承自 nn.Module
class ResBlock(nn.Module):def __init__(self, channels_in):# 调用父类的构造函数super().__init__()# 定义第一个卷积层输入通道数为 channels_in输出通道数为 30卷积核大小为 5填充为 2self.conv1 torch.nn.Conv2d(channels_in, 30, 5, padding2)# 定义第二个卷积层输入通道数为 30输出通道数为 channels_in卷积核大小为 3填充为 1self.conv2 torch.nn.Conv2d(30, channels_in, 3, padding1)def forward(self, x):# 输入数据通过第一个卷积层out self.conv1(x)# 经过第一个卷积层的输出再通过第二个卷积层out self.conv2(out)# 将输入 x 与卷积输出 out 相加并通过 ReLU 激活函数return F.relu(out x)定义ResNet网络
# 定义 ResNet 网络类继承自 nn.Module
class ResNet(nn.Module):def __init__(self):# 调用父类的构造函数super().__init__()# 定义第一个卷积层输入通道数为 1输出通道数为 20卷积核大小为 5self.conv1 torch.nn.Conv2d(1, 20, 5)# 定义第二个卷积层输入通道数为 20输出通道数为 15卷积核大小为 3self.conv2 torch.nn.Conv2d(20, 15, 3)# 定义最大池化层池化核大小为 2self.maxpool torch.nn.MaxPool2d(2)# 定义第一个残差块输入通道数为 20self.resblock1 ResBlock(channels_in20)# 定义第二个残差块输入通道数为 15self.resblock2 ResBlock(channels_in15)# 定义全连接层输入特征数为 375输出特征数为 10self.full_c torch.nn.Linear(375, 10)def forward(self, x):# 获取输入数据的批次大小size x.shape[0]# 输入数据通过第一个卷积层然后进行最大池化最后通过 ReLU 激活函数x F.relu(self.maxpool(self.conv1(x)))# 经过第一个卷积和池化的输出通过第一个残差块x self.resblock1(x)# 经过第一个残差块的输出通过第二个卷积层然后进行最大池化最后通过 ReLU 激活函数x F.relu(self.maxpool(self.conv2(x)))# 经过第二个卷积和池化的输出通过第二个残差块x self.resblock2(x)# 将输出数据展平为一维向量x x.view(size, -1)# 展平后的向量通过全连接层x self.full_c(x)return x模型导入GPU
model ResNet().to(device)定义训练函数
# 定义训练函数
def train(dataloader, model, loss_fn, optimizer):# 将模型设置为训练模式这会影响一些层如 Dropout、BatchNorm 等的行为model.train()# 初始化批次编号batch_size_num 1# 遍历数据加载器中的每个批次for x, y in dataloader:# 将输入数据和标签移动到指定设备如 GPUx, y x.to(device), y.to(device)# 前向传播计算模型的预测结果pred model.forward(x)# 通过交叉熵损失函数计算预测结果与真实标签之间的损失值loss loss_fn(pred, y)# 反向传播步骤# 清零优化器中的梯度信息防止梯度累积optimizer.zero_grad()# 反向传播计算每个参数的梯度loss.backward()# 根据计算得到的梯度更新模型的参数optimizer.step()# 从张量中提取损失值的标量loss_value loss.item()# 每 100 个批次打印一次损失值if batch_size_num % 100 0:print(floss:{loss_value:7f} [number:{batch_size_num}])# 批次编号加 1batch_size_num 1
定义测试函数
# 定义测试函数
def test(dataloader, model, loss_fn):# 获取数据集的总样本数size len(dataloader.dataset)# 获取数据加载器中的批次数量num_batches len(dataloader)# 将模型设置为评估模式这会影响一些层如 Dropout、BatchNorm 等的行为model.eval()# 初始化测试损失和正确预测的样本数test_loss, correct 0, 0# 上下文管理器关闭梯度计算减少内存消耗with torch.no_grad():# 遍历数据加载器中的每个批次for x, y in dataloader:# 将输入数据和标签移动到指定设备如 GPUx, y x.to(device), y.to(device)# 前向传播计算模型的预测结果pred model.forward(x)# 累加每个批次的损失值test_loss loss_fn(pred, y).item()# 计算每个批次中预测正确的样本数并累加correct (pred.argmax(1) y).type(torch.float).sum().item()# 计算平均测试损失test_loss / num_batches# 计算平均准确率correct / size# 打印测试结果print(fTest result: \n Accuracy:{(100 * correct)}%,Avg loss:{test_loss})创建损失函数和优化器
# 创建交叉熵损失函数对象
loss_fn nn.CrossEntropyLoss()
# 创建 Adam 优化器用于更新模型的参数
optimizer torch.optim.Adam(model.parameters(), lr0.001)
scheduler torch.optim.lr_scheduler.StepLR(optimizer,step_size3,gamma0.1)训练测试数据
# 定义训练的轮数
epochs 26
# 开始训练循环
for t in range(epochs):print(fepoch{t 1}\n--------------------)# 调用训练函数进行一轮训练train(train_dataloader, model, loss_fn, optimizer)
print(Done!)
# 调用测试函数进行测试
test(test_dataloader, model, loss_fn)结果