0%

deep_learning_computaion

Custom Layers and Blocks

背景

对于神经网络,不论是单个神经元,还是一层神经元,还是多层神经元组成的神经网络,它们都有同样的抽象结构:

  • 接受一组输入
  • 产生对应的输出
  • 有可调节的网络参数

在深度学习中,通常会封装一个多层网络,这个多层比单层神经网络要多,但是比整个深度神经网络要少的网络。这个多层网络同样具有以上的抽象结构。封装这个多层网络的是为了方便复用网络结构,例如在ResNet-152架构中(用于计算机视觉的深度网络),整个模型有几百层神经网络,但是这个神经网络是由重复的几组多层网络结构构成的。这种设计在许多深度神经网络中都很常见。

通常,我们把这种封装好的多层网络结构叫做block。而且,在深度学习编程框架中,一个Block通常封装在一个类中。这个类需要实现以下功能:

  • 一个forward function用于将输入转换为输出
  • 保存网络的参数
  • 一个backward function用于计算梯度,但是感谢深度学习框架中的自动微分功能,我们通常不用实现这个backward function。

自定义block示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import tensorflow as tf


class MyBlock(tf.keras.Model):
"""
a custom block with a hidden layer(256 unit) and a output layer(10 unit)
"""

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.hidden = tf.keras.layers.Dense(units=256, activation=tf.nn.relu)
self.out = tf.keras.layers.Dense(units=10)

def call(self, inputs, training=None, mask=None):
return self.out(self.hidden(inputs))

自定义layer

参数管理

延迟初始化

参数存储和加载

使用GPU