torch.nn 是专门为神经网络设计的模块化接口。构建于 Autograd 之上,可用来定义和运行神经网络。下面介绍几个常用的类:
注: torch.nn 为了方便使用,将它设置成 nn 的别名。
除了 nn 别名以外,我们还引用了 nn.functional,这个包中包含了神经网络中使用的一些常用的函数,这些函数的特点是,不具有可学习的参数(ReLu, pool, DropOut 等),这些函数可以放在构造函数中,也可以不放,但是这里建议不放。
一般情况下,我们将 nn.functional 设置为大写的 F, 这样缩写方便调用
PyTorch 中已经为我们准备好了现成的网络模型,只要继承 nn.module,并实现它的 forward 方法, PyTorch 会根据 autograd,自动实现 backward 函数,在 forward 函数中可使用任何 tensor 支持的函数,还可以使用 if、for 循环、print、 log 等 Python 语法,写法和标准的 Python 写法一致。
网络的可学习参数通过 net.parameters() 返回。
net.named_parameters 可以同时返回可学习的参数及名称。
forward 函数的输入和输出都是 Tensor。
在反向传播前,先要将所有参数的梯度清零。
注意 :torch. nn 只支持 mini-batches,不支持一次只输入一个样本,即一次必须是一个 batch。
也就是说,就算我们输入一个样本,也会对样本进行分批,所以,所有的输入都会增加一个维度,我们对比下刚才的nn中定义为3维,但是我们人工创建时多增加了一个维度,变为了4 维,最前面的 1 即为 batch-size。
在 nn 中 PyTorch 还预制了常用的损失函数,下面我们用 MSELOSS 用来计算均方误差
在反向传播中计算完所有参数的梯度后,还需要使用优化方法来更新网络的权重和参数,例如随机梯度下降法(SGD)的更新策略如下:
torch.optim中实现大多数的优化方法,例如:RMSProp、Adam、SGD 等,下面我们使用SGD 做个简单的样例: