Pytorch基础(五)nn模块及optimizer
目录
计算图和autograd是十分强大的工具,可以定义复杂的操作并自动求导;然而对于大规模的网络,autograd太过于底层。在构建神经网络是,我们经常考虑将计算安排成层,其中一些具有可学习的参数,他们将在隵过程中进行优化。
Tensorflow里面,有类似于Keras,TensorFlow-Slim和FLearn这些封装了底层计算图的高层抽象接口,这使得构建网络是否方便。
在PyTorch中,包nn完成了同样的功能。nn包中定义了一组大致等价于层的模块。一个模块接受输入的tensor,计算输出的tensor,而且还保存了一些内部状态比如学习的tensor的参数等等。nn包中也定义了一组损失函数loss functions,用来训练神经网络。
在下面的例子中,我们用nn包实现两层的网络:
运行结果如下:
到目前为止,我们已经通过手动改变可学习参数的张量来更新模型的权重。对于随机梯度下降(SGD/stochastic gradient descent)等简单的优化算法来说,这不是一个很大的负担,但在实践中,我们常用AdaGrad,RMSPro,Adam等更复杂的优化器来训练网络。
运行结果如下:
有时候需要指定比现有模块序列更复杂的模型,对于这些情况,可以通过集成nnModule并定义forward函数,这个forward函数可以试用期他模块或者其他的自动求导运算来接收输入的tensor,产生输出tensor。
这个例子中,我们用自定义Module的子类构建两层网络:
运行结果如下:
作为动态图和权重共享的例子,这里有一个非常奇怪的模型:一个全连接的ReLU网络,在每一册前向传播时,它的隐藏层的层数为随机1到4之间的数,这样可以多次重复相同的权重来计算。
因为这个模型可以使用普通的Python流控制来实现循环,并且我们可以通过在定义转发时多次重用同一个模块来实现最易内层之间的权重共享。
我们利用Module的子类来实现这个模型:
运行结果如下:
?