Bonky
Neither believe nor reject anything, because any other person has rejected or believed it. Heaven has given you a mind for judging truth and error, Use it.
By Thomas Jefferson

Pytorch 的神经网络

我们可以使用torch.nn包来构建神经网络。 一个nn.Module包含各个层和一个forward(input)方法,该方法返回output

Image result for neural  network

神经网络的典型训练过程如下:

  1. 定义包含一些可学习的参数(或者叫权重)神经网络模型;
  2. 在数据集上迭代;
  3. 通过神经网络处理输入;
  4. 计算损失(输出结果和正确值的差值大小);
  5. 将梯度反向传播回网络的参数;
  6. 更新网络的参数,主要使用如下简单的更新原则: weight = weight - learning_rate * gradient

定义网络

img

以上图为例,上图为手写数字识别经典的算法LeNet-5 ,下面是他的实现:(推荐阅读:具体原理和网络参数的解释请见:网络解析(一):LeNet-5 详解)

代码输出如下:

在模型中必须要定义 forward 函数,backward 函数(用来计算梯度)会被autograd自动创建。 可以在 forward 函数中使用任何针对 Tensor 的操作。一般来说自定义自己网络的时候需要注意:

  1. 一般把网络中具有可学习参数的层(如全连接层、卷积层等)放在构造函数__init__()中,当然我也可以吧不具有参数的层也放在里面;
  2. 一般把不具有可学习参数的层(如ReLUdropoutBatchNormanation层)可放在构造函数中,也可不放在构造函数中,如果不放在构造函数init里面,则在forward方法里面可以使用nn.functional来代替
  3. forward方法是必须要重写的,它是实现模型的功能,实现各个层之间的连接关系的核心。

net.parameters()返回可被学习的参数(权重)列表和值的 generator

将所有参数的梯度缓存清零,然后进行随机梯度的的反向传播:

更多的神经Layer可见 → TORCH.NN

更多激活函数可见 → TORCH.NN.FUNCTIONAL

“屏幕快照 2019-08-31 下午4.51.29”的副本

损失函数

一个损失函数接受一对 (output, target) 作为输入(output为网络的输出,target为实际值),计算一个值来估计网络的输出和目标值相差多少。

nn包中有很多不同的损失函数nn.MSELoss是一个比较简单的损失函数,它计算输出和目标间的均方误差, 例如:

输出结果如下

更多的损失函数可见 → TORCH.NN

传播误差

调用loss.backward()获得反向传播的误差。

但是在调用前需要清除已存在的梯度,否则梯度将被累加到已存在的梯度。

现在,我们将调用loss.backward(),并查看conv1层的偏差(bias)项在反向传播前后的梯度。

返回结果如下:

更新权重

在实践中最简单的权重更新规则是随机梯度下降(SGD)

PyTorch中构建了一个包torch.optim实现了所有的这些规则。 使用它们非常简单:

更多的优化算法方法可见 → TORCH.OPTIM

附:完整代码

训练结果如下;

我们可以发现,Loss 越来越小,从接近1到数量积只有10^-8^。然后 output 也越来越接近 target 全为1

Share

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注