模型创建初步
发布日期:2021-05-14 14:42:10 浏览次数:28 分类:精选文章

本文共 1859 字,大约阅读时间需要 6 分钟。

模型创建初步

在模型创建的过程中,我们首先需要处理数据集的划分与预处理。通过设置随机种子以确保实验的可重复性,我们使用了osrandomnumpy以及torch等库来初始化随机环境。数据集的划分路径由split_dir指定,训练集和验证集的路径分别由train_dirvalid_dir确定。

在数据预处理阶段,我们使用了torchvision.transforms来定义标准化参数norm_meannorm_std。训练集的预处理包括随机裁剪、到Tensor转换以及标准化,而验证集的预处理则包括缩放、到Tensor转换和标准化。通过DataLoader实例,我们构建了训练集和验证集的-mini-batch数据集。

在模型部分,我们选择了LeNet作为基础网络结构。通过initialize_weights方法,我们对模型参数进行了初始化。为了评估模型性能,我们使用了CrossEntropyLoss作为损失函数,并将SGD作为优化器。

在训练过程中,我们记录了每个epoch的训练损失和验证损失。通过设置log_intervalval_interval,我们实现了训练过程中的信息打印和验证集的评估。为了动态调整学习率,我们使用了StepLR学习率调度器。

通过可视化工具,我们绘制了训练曲线和验证曲线,以直观地展示模型的训练效果。具体来说,训练曲线train_curve记录了每个iteration的平均损失值,而验证曲线valid_curve记录了每个epoch的验证损失。

在模型推理部分,我们使用了测试数据集对模型进行了 inference。通过将输入数据经过模型,获取预测结果,并根据预测值判断输出类别(1或100)。

模块容器与AlexNet构建

在模块容器的实现中,我们首先介绍了SequentialModuleListModuleDict这三种常见的模块容器类型。Sequential通过nn.Sequential实现了简单的网络结构,而ModuleListModuleDict则提供了更灵活的模块组织方式。

通过代码示例,我们展示了如何使用Sequential构建LeNet模型。LeNetSequential类包含了特征层和分类器两部分,分别通过nn.Sequential实现。LeNetSequentialOrderDict类则使用了OrderedDict来精确控制各模块的连接顺序。

ModuleList的实现中,我们创建了一个包含20个线性层的模块列表。通过遍历模块列表,我们对输入数据进行了逐层线性变换。ModuleDict实现了模块的选择和激活函数的组织,通过choicesactivations两个子模块,它允许在运行时选择不同的模块并执行相应的激活函数。

最后,我们加载了AlexNet模型,这是一个常用的CNN模型,具有较深的网络结构和丰富的预训练特性。

nn网络层-卷积层

卷积层是深度学习中核心的运算单元。通过nn.Conv2d实现的卷积层能够在图像的空间维度上进行局部感受野操作。通过设置stridekernel_size,我们可以实现不同尺度的卷积操作。

在代码示例中,我们展示了卷积层的基本使用方法。通过nn.Conv2d实例化卷积层,输入图像经过卷积操作后尺寸发生了变化。我们还展示了卷积层的转置操作ConvTranspose2d,这是在特征图重建等任务中常用的。

通过transform_invert函数,我们可以将经过标准化、归一化和归一化处理的张量还原为原始图像。这种功能是非常有用的,尤其是在调试和可视化阶段。

nn网络层-池化-线性-激活函数

池化操作是卷积神经网络中的另一个关键操作。通过nn.MaxPool2d实现的最大池化和nn.AvgPool2d实现的平均池化,能够有效地降低网络的计算复杂度同时保留特征图的位置信息。

在代码示例中,我们展示了池化操作的实现。最大池化和平均池化对输入特征图的尺寸产生了不同的影响。我们还展示了最大池化的反向传播和重建操作,这在有些任务中非常有用。

线性层和激活函数是深度神经网络的另两个核心组件。通过nn.Linear实现的全连接层能够将空间维度降低到网络的深度维度。激活函数如ReLUPReLU能够非线性地激活网络单元,从而捕捉复杂的特征信息。

通过代码示例,我们展示了如何使用线性层和激活函数构建网络的全连接部分。输入数据经过线性变换后,通过激活函数进行非线性转换,最终输出预测结果。

上一篇:权值初始化和与损失函数
下一篇:c++入门

发表评论

最新留言

很好
[***.229.124.182]2025年05月21日 04时58分29秒