Custom Layers and Blocks
背景
对于神经网络,不论是单个神经元,还是一层神经元,还是多层神经元组成的神经网络,它们都有同样的抽象结构:
- 接受一组输入
- 产生对应的输出
- 有可调节的网络参数
在深度学习中,通常会封装一个多层网络,这个多层比单层神经网络要多,但是比整个深度神经网络要少的网络。这个多层网络同样具有以上的抽象结构。封装这个多层网络的是为了方便复用网络结构,例如在ResNet-152架构中(用于计算机视觉的深度网络),整个模型有几百层神经网络,但是这个神经网络是由重复的几组多层网络结构构成的。这种设计在许多深度神经网络中都很常见。
通常,我们把这种封装好的多层网络结构叫做block。而且,在深度学习编程框架中,一个Block通常封装在一个类中。这个类需要实现以下功能:
- 一个forward function用于将输入转换为输出
- 保存网络的参数
- 一个backward function用于计算梯度,但是感谢深度学习框架中的自动微分功能,我们通常不用实现这个backward function。
自定义block示例
1 | import tensorflow as tf |