pytorch神经网络工具箱

PyTorch神经网络工具箱

3.1 神经网络核心组件

1)层:神经网络的基本结构,将输入张量转换为输出张量
2)模型:层构成网络
3)损失函数:参数学习的目标函数,通过最小化损失函数来学习各种参数
4)优化器:如何使损失函数最小,这就涉及优化器

多个层链接在一起构成一个模型或网络,输入数据通过这个模型转换为预测值,然后损失函数把预测值与真实值进行比较,得到损失值(损失值可以是距离,概率值等),此损失值用于衡量预测值与目标结果的匹配或相似程度,优化器利用损失值更新权重参数,从而使损失值越来越小。这是一个循环过程,当损失值达到一个阈值或循环次数到达指定次数,循环结束。

3.2 实现神经网络实例

构建网络层可以基于Module类或函数(nn.functional)。nn中的大多数层(layer)在functional中都有与之对应的函数。nn.functional中函数与nn.Module中的Layer的主要区别就是后者继承Module类,会自动提取可学习的参数,而nn.funcitonal更像是纯函数。两者区别不大
像卷积层,全连接层,Dropout层等因含有可学习参数,一般使用nn.Module
而激活函数,池化层不含可学习参数,可以使用nn.functional中对应的函数

3.3

3.3.2 前向传播

定义好每层后,最后还需要通过前向传播的方式把这些串起来。即涉及forward函数的问题。forward函数的任务需要把输入层,网络层,输出层链接起来,实现信息的前向传导。该函数的参数一般为输入数据,返回值为输出数据。
在forward函数中,有些层来自nn.Module, 也可以使用nn.functional定义。来自nn.Module的需要实例化,而使用nn.functional定义的可以直接使用

3.3.3 反向传播

关键是利用复合函数的链式法则,pytorch提供了自动反向传播的功能,使用nn工具箱,无须自己编写反向传播,直接让损失函数(loss)调用backward()即可
在反向传播过程中,优化器是一个重要角色,优化方法有很多,3.2节采用SGD优化器

3.3.4 训练模型

调用model.train()会把所有的module设置为训练模式。
如果是测试或验证阶段,需要使模型处于验证阶段,即调用module.eval (), 会把所有的training属性设置为False
缺省情况下梯度是累加的,需要手工把梯度初始化或清零,调用optimizer.zero_grad()即可。训练过程中,正向传播生成网络的输出,计算输出和实际值之间的损失值。调用loss.backward()自动生成梯度,然后使用optimizer.step()执行优化器,把梯度传播回每个网络。
如果希望用GPU训练,需要把模型,训练数据,测试数据发送到GPU上,即调用.to(device)。如果需要使用多GPU进行处理,可使用模型或相关数据引用nn.DataParallel

3.4神经网络工具箱nn

在nn工具箱中有两个重要模块:nn.Model, nn.functional

3.4.1 nn.Module

nn.Module是nn的一个核心数据结构,它可以是神经网络的某个层,也可以是包含多层的神经网络。在实际使用中,最常见的做法是继承nn.Module, 生成自己的网络/层

3.4.2 nn.functional

nn中的层,一类是集成了nn.Module,其命名一般为nn.Xxx(第一个是大写),如nn.Linear, nn.Conv2d, nn.CrossEntropyLoss等。另一类是nn.functional中的函数,其名字一般为nn.funtional.xxx, 如nn.funtional.linear, nn.funtional.cross_entropy等。
nn.functional和nn.Module的区别:
1)nn.Xxx继承于nn.Module, nn.Xxx需要先实例化并传入参数,然后以函数调用的方法调用实例化的对象并传入输入数据。它能够很好地与nn.Sequential结合使用,而nn.functional.xxx语法与nn.Sequential结合使用
2)nn.Xxx不需要自己定义和管理weght, bias参数;而nn.functional.xxx需要自己定义weight, bias参数,每次调用的时候都需要手动传入weight, bias等参数,不利于代码的复用
3)Dropout操作在训练和测试阶段是有区别的,使用nn.Xxx方法定义Dropout, 在调用model.eval()之后,自动实现状态的转换,而使用nn.functional.xxx却无此功能

总的来说,两种功能是相同的,但pytorch官方推荐;具有学习参数的(例如,conv2d,linear, batch_norm)采用nn.Xxxx方式,没有学习参数的(例如,maxpool, loss func, activation func)等根据个人选择使用nn.functional.xxx或者nn.Xxx方式。

3.5 优化器

自适应优化器在深度学习中比较受欢迎,性能较好,鲁棒性,泛化能力也更强。

%matplotlib inline的作用
%matplotlib inline 可以在Ipython编译器里直接使用,功能是可以内嵌绘图,并且可以省略掉plt.show()这一步。
用在Jupyter notebook中具体作用是当你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,可以直接在你的python console里面生成图像。

你可能感兴趣的:(深度学习,神经网络,pytorch,深度学习)