
本文共 1859 字,大约阅读时间需要 6 分钟。
模型创建初步
在模型创建的过程中,我们首先需要处理数据集的划分与预处理。通过设置随机种子以确保实验的可重复性,我们使用了os
、random
、numpy
以及torch
等库来初始化随机环境。数据集的划分路径由split_dir
指定,训练集和验证集的路径分别由train_dir
和valid_dir
确定。
在数据预处理阶段,我们使用了torchvision.transforms
来定义标准化参数norm_mean
和norm_std
。训练集的预处理包括随机裁剪、到Tensor转换以及标准化,而验证集的预处理则包括缩放、到Tensor转换和标准化。通过DataLoader
实例,我们构建了训练集和验证集的-mini-batch数据集。
在模型部分,我们选择了LeNet
作为基础网络结构。通过initialize_weights
方法,我们对模型参数进行了初始化。为了评估模型性能,我们使用了CrossEntropyLoss
作为损失函数,并将SGD
作为优化器。
在训练过程中,我们记录了每个epoch的训练损失和验证损失。通过设置log_interval
和val_interval
,我们实现了训练过程中的信息打印和验证集的评估。为了动态调整学习率,我们使用了StepLR
学习率调度器。
通过可视化工具,我们绘制了训练曲线和验证曲线,以直观地展示模型的训练效果。具体来说,训练曲线train_curve
记录了每个iteration的平均损失值,而验证曲线valid_curve
记录了每个epoch的验证损失。
在模型推理部分,我们使用了测试数据集对模型进行了 inference。通过将输入数据经过模型,获取预测结果,并根据预测值判断输出类别(1或100)。
模块容器与AlexNet构建
在模块容器的实现中,我们首先介绍了Sequential
、ModuleList
和ModuleDict
这三种常见的模块容器类型。Sequential
通过nn.Sequential
实现了简单的网络结构,而ModuleList
和ModuleDict
则提供了更灵活的模块组织方式。
通过代码示例,我们展示了如何使用Sequential
构建LeNet模型。LeNetSequential
类包含了特征层和分类器两部分,分别通过nn.Sequential
实现。LeNetSequentialOrderDict
类则使用了OrderedDict
来精确控制各模块的连接顺序。
在ModuleList
的实现中,我们创建了一个包含20个线性层的模块列表。通过遍历模块列表,我们对输入数据进行了逐层线性变换。ModuleDict
实现了模块的选择和激活函数的组织,通过choices
和activations
两个子模块,它允许在运行时选择不同的模块并执行相应的激活函数。
最后,我们加载了AlexNet模型,这是一个常用的CNN模型,具有较深的网络结构和丰富的预训练特性。
nn网络层-卷积层
卷积层是深度学习中核心的运算单元。通过nn.Conv2d
实现的卷积层能够在图像的空间维度上进行局部感受野操作。通过设置stride
和kernel_size
,我们可以实现不同尺度的卷积操作。
在代码示例中,我们展示了卷积层的基本使用方法。通过nn.Conv2d
实例化卷积层,输入图像经过卷积操作后尺寸发生了变化。我们还展示了卷积层的转置操作ConvTranspose2d
,这是在特征图重建等任务中常用的。
通过transform_invert
函数,我们可以将经过标准化、归一化和归一化处理的张量还原为原始图像。这种功能是非常有用的,尤其是在调试和可视化阶段。
nn网络层-池化-线性-激活函数
池化操作是卷积神经网络中的另一个关键操作。通过nn.MaxPool2d
实现的最大池化和nn.AvgPool2d
实现的平均池化,能够有效地降低网络的计算复杂度同时保留特征图的位置信息。
在代码示例中,我们展示了池化操作的实现。最大池化和平均池化对输入特征图的尺寸产生了不同的影响。我们还展示了最大池化的反向传播和重建操作,这在有些任务中非常有用。
线性层和激活函数是深度神经网络的另两个核心组件。通过nn.Linear
实现的全连接层能够将空间维度降低到网络的深度维度。激活函数如ReLU
和PReLU
能够非线性地激活网络单元,从而捕捉复杂的特征信息。
通过代码示例,我们展示了如何使用线性层和激活函数构建网络的全连接部分。输入数据经过线性变换后,通过激活函数进行非线性转换,最终输出预测结果。
发表评论
最新留言
关于作者
