深度学习案例教程 教案3.4.2全连接神经网络搭建.docx
我们本节课来做实践任务二,全连接神经网络模型搭建。
首先第一步,进行定义全连接神经网络,
(p1)
在PyTorch中,torch.nn是专门为神经网络设计的模块化接口,
nn库构建与于autograd之上
(autograd为Tensor所有操作提供了自动微分),
可以用于定义和运行神经网络。
nn.Module是nn库中十分重要的类,
它包含网络各层的定义以及forward函数,
PyTorch允许定义自己的神经网络,
但需要继承nn.Module类,
并实现forward函数。
只要在nn.Module的子类中定义forward函数,
backward函数就会被自动实现,
一般把神经网络中具有可学习参数的层放到构造函数__init__中,
而不具有可学习参数的层(如ReLU激活函数),
可放在构造函数中也可不放在构造函数中。
(p2)
我们来看一下具体的代码
首先定义了一个名为NeuralNet的神经网络模型类。
这个类继承自nn.Module类,并实现了__init__和forward两个方法。
在__init__方法中,我们定义了3个全连接层,
分别是输入层、隐藏层和输出层。
其中,输入层的大小为input_num,
隐藏层的大小为hidden_num,
输出层的大小为output_num。
我们使用nn.Linear函数来定义这些层,
并将它们存储在self.fc1、self.fc2和self.relu属性中。
其中,fc1和fc2属性表示全连接层,
relu属性表示激活函数,
这里我们使用ReLU函数作为激活函数。
在forward方法中,我们定义了神经网络的前向传播过程,
也就是输入数据从输入层到输出层的计算过程。
具体来说,我们首先将输入数据x传递给输入层fc1,
然后通过激活函数relu进行非线性变换,得到隐藏层的输出。
接着,将隐藏层的输出传递给输出层fc2,得到最终的输出结果y。
最后,将输出结果返回。
(p3)
接着,我们需要设置一些参数
包括训练轮数epoches、
学习率lr、
输入层大小input_num、
隐藏层大小hidden_num、
输出层大小output_num和设备类型device。
其中,我们使用torch.device函数来确定设备类型,如果当前计算机支持CUDA,则使用GPU,否则使用CPU。
接下来,我们创建了一个名为model的NeuralNet类的实例,
并将输入层、隐藏层和输出层的大小传递给构造函数。
这个模型会自动初始化权重和偏置参数,并使用ReLU作为激活函数。
最后,我们使用print函数输出模型的结构,以便于检查和调试。
(p4)
运行后将会输出模型的结构
(p5)
定义好网络模型后,
我们会将所有的数据按照batch的方式进行输入,
得到对应的网络输出,
这就是所有的前向传播,
这里取少量数据样本进行举例。
(p6)
这段代码进行了神经网络模型的前向传播过程,
即将输入数据传递给模型并输出相应的预测结果。
首先,我们将输入数据images进行重塑,
将其从原来的28x28的二维数组变为1维数组。
这样做是为了方便输入到神经网络中进行计算。
然后,我们从中随机选择两个样本进行测试,
并将它们存储在image和label变量中。
同时,我们使用print函数输出了image的大小和label的值,
以便于检查和调试。
接下来,我们将image传递给神经网络模型model的forward方法,
得到输出结果out。
这里的out是一个大小为(2,10)的张量,
表示对于这两个输入样本,模型分别预测它们属于10个类别的概率值。
我们可以使用print函数输出out的值,以便于检查和分析。
(p7)
运行程序输出的结果如下
(p8)
接下来我们看一下,如何计算损失
损失函数需要一对输入:模型输出和目标,
用来评估输出值和目标值之间的差距,
损失函数用loss表示,
损失函数的作用就是计算神经网络每次迭代的前向计算结果和真实值之间的差距,
从而指导模型下一步训练往正确的方向进行。
常见的损失函数有交叉熵损失函数和均方误差损失函数。
(p9)
在PyTorch中,nn库模块提供了多种损失函数,常用的有以下几种:
1.处理回归问题的nn.MSELoss函数,
2.处理分类问题的nn.BCELoss函数,
3.处理多分类问题的nn.CrossEntropyLoss函数。
(p10)
我们以交叉熵损失函数为例,进行损失计算
这段代码定义了损失函数criterion,
并计算了当前模型在给定输入数据image和标签label下的损失值loss。
(