深度学习案例教程 教案4.5.2 卷积神经网络搭建.docx
(p1)
本节课我们将开始使用pytorch搭建卷积神经网络,解决fashinMNIST分类问题
(p2)
我们来看具体的实现代码
这段代码定义了一个名为Net的神经网络模型,继承自nn.Module类
在__init__()函数中,
我们首先调用了nn.Module的构造函数__init__(),
并传入了self参数和其他参数,以初始化神经网络模型。
接着,我们定义了卷积层和全连接层的结构,
并将它们封装在nn.Sequential()中,
使得它们可以按顺序依次执行。
卷积层:我们采用了两层卷积层,
每层包括了四个操作:卷积操作、ReLU激活函数、最大池化层和Dropout层。
这四个操作的顺序可以任意调整,
但通常先进行卷积操作,然后再进行激活、池化和Dropout操作。
第一层卷积层的输入通道数为1,输出通道数为32,卷积核大小为5x5。
ReLU激活函数对卷积结果进行非线性变换,
最大池化层进行下采样,Dropout层随机丢弃一部分神经元,以避免过拟合。
第二层卷积层的输入通道数为32,输出通道数为64,卷积核大小为5x5,
其余操作与第一层卷积层相同。
这样,我们可以提取更高级别的特征,以更好地区分不同的物体类别。
总的来说,这个神经网络模型的设计旨在提高分类精度和模型的泛化能力。
它通过多层卷积和池化操作,逐渐提取图像的特征,
并使用全连接层进行分类。
在训练过程中,我们还采用了Dropout层来防止过拟合,从而提高模型的泛化能力。
(p3)
在神经网络模型中,全连接层也是非常重要的一部分。
全连接层通常用于将卷积层提取的特征进行分类或回归。
全连接层可以将前面的卷积层或池化层提取的特征进行展开,
并将特征映射到指定的输出维度上,以实现分类或回归任务。
在定义全连接层时,我们需要设置输入和输出的维度大小。
在我们的模型中,第一层全连接层的输入大小为64x4x4,
因为在前面的卷积层中,
我们设置了两次卷积操作,并经过两次最大池化操作,大小缩小为64x4x4,
因此在全连接层中,输入大小为64x4x4=1024,
经过一次线性变换和ReLU激活函数后,输出大小为512。
第二层全连接层的输入大小为512,输出大小为10,用于进行10分类任务。
在全连接层中,我们采用了ReLU激活函数,
可以对全连接结果进行非线性变换,
增强模型的非线性建模能力,并实现更好的分类效果。
在我们的模型中,第二层全连接层的输出大小为10,
表示将特征映射到10个类别的概率分布上,用于进行分类任务。
在后续模型的训练过程中,我们采用交叉熵损失函数对模型进行优化,
以最小化预测值与真实标签之间的差距。
(p4)
在神经网络模型中,forward()函数是定义模型前向传播过程的函数。
在forward()函数中,我们首先通过self.conv(x)进行卷积操作,
将输入的特征图与卷积核进行卷积运算,
得到一组输出特征图。
这一步操作可以提取出输入图像的特征信息,并用于后续的分类任务。
在卷积操作之后,我们需要将输出特征图展开成一维向量,
方便进行全连接操作。
在我们的模型中,我们使用了view()函数对特征图进行展开操作,
将其转换为一维的向量形式,以便进行全连接操作。
在展开操作之后,我们通过self.fc(x)进行全连接操作,
将特征向量映射到指定的输出维度上,生成最终的分类结果。
在这一步操作中,我们采用了两层全连接层,第一层包括了ReLU激活函数,
第二层输出10个类别的概率分布,用于进行分类任务。
在经过卷积和全连接操作之后,我们通过return语句返回模型的输出,即最终的分类结果。
在训练和测试过程中,我们可以根据模型的输出结果来计算损失函数和准确率,
并对模型进行优化和评估。
通过对forward()函数的设置和调整,我们可以构建出一个高效、准确和泛化能力强的神经网络模型,
实现对fashionmnist分类任务。
(p5)
编写完Net类之后,
我们来尝试定义一个具体的卷积模型
这段代码用于将模型部署到GPU上,以加速模型训练和推理。
具体来说,第一行代码创建了一个名为model的神经网络模型,
使用了之前定义的Net()类。
第二行代码将模型部署到GPU上,
使用了model.cuda()函数。
该函数会将模型的所有参数和计算图复制到GPU上,以利用GPU的并行计算能力。
第三行代码用于打印模型的结构信息。
可以通过print(model)函数来输出模型的详细信息,包括模型的各个层、参数数量和计算图等信息。
(p6)
运行代码后,我们就能看到具体的网络结构
关于模型搭建的内容我们就讲解到这里