PyTorch已为我们实现了大多数常用的非线性激活函数,我们可以像使用任何其他的层那样使用它们。让我们快速看一个在PyTorch中使用ReLU激活函数的例子:
在上面这个例子中,输入是包含两个正值、两个负值的张量,对其调用ReLU函数,负值将取为0,正值则保持不变。
现在我们已经了解了构建神经网络架构的大部分细节,我们来构建一个可用于解决真实问题的深度学习架构。上一章中,我们使用了简单的方法,因而可以只关注深度学习算法如何工作。后面将不再使用这种方式构建架构,而是使用PyTorch中正常该用的方式构建。
1.PyTorch构建深度学习算法的方式
PyTorch中所有网络都实现为类,创建PyTorch类的子类要调用nn.Module,并实现__init__和forward方法。在init方法中初始化层,这一点已在前一节讲过。在forward方法中,把输入数据传给init方法中初始化的层,并返回最终的输出。非线性函数经常被forward函数直接使用,init方法也会使用一些。下面的代码片段展示了深度学习架构是如何用PyTrorch实现的:
如果你是Python新手,上述代码可能会比较难懂,但它全部要做的就是继承一个父类,并实现父类中的两个方法。在Python中,我们通过将父类的名字作为参数传入来创建子类。init方法相当于Python中的构造器,super方法用于将子类的参数传给父类,我们的例子中父类就是nn.Module。
2.不同机器学习问题的模型架构
待解决的问题种类将基本决定我们将要使用的层,处理序列化数据问题的模型从线性层开始,一直到长短期记忆(LSTM)层。基于要解决的问题类别,最后一层是确定的。使用机器学习或深度学习算法解决的问题通常有三类,最后一层的情况通常如下。
·对于回归问题,如预测T恤衫的销售价格,最后使用的是有一个输出的线性层,输出值为连续的。
·将一张给定的图片归类为T恤衫或衬衫,用到的是sigmoid激活函数,因为它的输出值不是接近1就是接近0,这种问题通常称为二分类问题。
·对于多类别分类问题,如必须把给定的图片归类为T恤、牛仔裤、衬衫或连衣裙,网络最后将使用softmax层。让我们抛开数学原理来直观理解softmax的作用。举例来说,它从前一线性层获取输入,并输出给定数量样例上的概率。在我们的例子中,将训练它预测每个图片类别的4种概率。记住,所有概率相加的总和必然为1。
3.损失函数
一旦定义好了网络架构,还剩下最重要的两步。一步是评估网络执行特定的回归或分类任务时表现的优异程度,另一步是优化权重。
优化器(梯度下降)通常接受一个标量值,因而loss函数应生成一个标量值,并使其在训练期间最小化。某些用例,如预测道路上障碍物的位置并判断是否为行人,将需要两个或更多损失函数。即使在这样的场景下,我们也需要把损失组合成一个优化器可以最小化的标量。最后一章将详细讨论把多个损失值组合成一个标量的真实例子。
上一章中,我们定义了自己的loss函数。PyTorch提供了经常使用的loss函数的实现。我们看看回归和分类问题的loss函数。
回归问题经常使用的loss函数是均方误差(MSE)。它和前面一章实现的loss函数相同。可以使用PyTorch中实现的loss函数,如下所示:
对于分类问题,我们使用交叉熵损失函数。在介绍交叉熵的数学原理之前,先了解下交叉熵损失函数做的事情。它计算用于预测概率的分类网络的损失值,损失总和应为1,就像softmax层一样。当预测概率相对正确概率发散时,交叉熵损失增加。例如,如果我们的分类算法对图3.5为猫的预测概率值为0.1,而实际上这是只熊猫,那么交叉熵损失就会更高。如果预测的结果和真实标签相近,那么交叉熵损失就会更低。
图3.5
下面是用Python代码实现这种场景的例子。
为了在分类问题中使用交叉熵损失,我们真得不需要担心内部发生的事情——只要记住,预测差时损失值高,预测好时损失值低。PyTorch提供了loss函数的实现,可以按照如下方式使用。
PyTorch包含的其他一些loss函数如表3.1所示。
表3.1
L1 loss
通常作为正则化器使用;第4章将进一步讲述
MSE loss
均方误差损失,用于回归问题的损失函数
Cross-entropy loss
交叉熵损失,用于二分类和多类别分类问题
NLL Loss
用于分类问题,允许用户使用特定的权重处理不平衡数据集
NLL Loss2d
用于像素级分类,通常和图像分割问题有关
4.优化网络架构
计算出网络的损失之后,需要优化权重以减少损失,并改善算法准确率。简单起见,让我们看看作为黑盒的优化器,它们接受损失函数和所有的学习参数,并微量调整来改善网络性能。PyTorch提供了深度学习中经常用到的大多数优化器。如果大家想研究这些优化器内部的动作,了解其数学原理,强烈建议浏览以下博客:
PyTorch提供的一些常用的优化器如下:
·ADADELTA
·Adagrad
·Adam
·SparseAdam
·Adamax
·ASGD
·LBFGS
·RMSProp
·Rprop
·SGD
最后欢迎大家一起讨论,共同进步,共同学习
审核编辑:汤梓红
-
函数
+关注
关注
3文章
4131浏览量
61553 -
python
+关注
关注
53文章
4705浏览量
83704 -
pytorch
+关注
关注
2文章
774浏览量
12906
发布评论请先 登录
相关推荐
神经网络中激活函数的定义及类型
神经网络中的激活函数有哪些
如何在DSADC中使用外部生成载波而不是aurix生成的激发波的例子?
pytorch模型转换需要注意的事项有哪些?
如何往星光2板子里装pytorch?
Dynamic ReLU:根据输入动态确定的ReLU
![Dynamic <b class='flag-5'>ReLU</b>:根据输入动态确定的<b class='flag-5'>ReLU</b>](https://file1.elecfans.com/web2/M00/A1/4B/wKgZomTxrqSAUyIaAAAr2INQSBE129.png)
深度学习框架pytorch入门与实践
如何在Vitis HLS GUI中使用库函数?
![如何在Vitis HLS GUI<b class='flag-5'>中使</b>用库<b class='flag-5'>函数</b>?](https://file1.elecfans.com/web2/M00/90/A9/wKgZomTcNDaAcqFmAAAt4OHi_oA924.png)
在Zynq裸机设计中使用视觉库L1 remap函数的示例
![在Zynq裸机设计<b class='flag-5'>中使</b>用视觉库L1 remap<b class='flag-5'>函数</b>的示例](https://file1.elecfans.com/web2/M00/8E/90/wKgZomTIa5aAYFrwAAAXbLh6QQk163.png)
评论