-
Notifications
You must be signed in to change notification settings - Fork 2
1. DL‐Theory‐Practice 简介
DL-Theory-Practice会尝试用尽可能统一的框架去实现不同的深度学习算法,目前主要会包括图像分类、GAN、目标检测、语义分割、Image-to-Image等。DL-Theory-Practice最大的特点是允许开发者仅通过配置文件可以实现非常丰富的网络定义,这主要得益于框架中采用的可嵌套Block的设计方案。
可嵌套Block给予了开发者使用配置文件定义网络的灵活性,但代价是配置文件的可读性变差。与可嵌套Block设计相关的核心概念有三个:
- Network:定义网络主体结构;
- Meta-Block:简写为M-Block,定义原子化的网络基础构件(Building Block)。M-Block无法嵌套其它Block;
- Nestable-Block:简写为N-Block,定义可嵌套的网络基础构件(Building Block)。N-Block中可以嵌套任意的N-Block或M-Block。
下面对这几个概念进行简要介绍,然后通过一个具体的ResNet示意来说明一些隐晦、不太容易理解的概念。
Network用来定义网络的主体结构。例如,仓库中实现了一个名为PlainNet的网络,它可以理解为是最简的、一层一层堆叠起来的网络,如下图所示。
一般来说,Network由一系列的Block构成,我们可以通过设置不同的Block来实现不同的模型。
例如:
-
如果把图中的每一个Block替换成一个标准的卷积,如Conv2d(nn_module/conv/convs/Conv2d),那么该网络对应的就是一个完全依靠卷积堆叠起来的网络(不含激活函数和Norm Layer)。
-
如果把图中的每一个Block替换成一个含Conv-Norm-Act的Block,如ConvNormAct(nn_module/conv/conv_norm_act/ConvNormAct),那么该网络对应的是一个含Norm Layer和激活函数的卷积网络。例如,通过将ConvNormAct Block的参数设置为:conv=Conv2d, norm=nn.BatchNorm2d, act=ReLU,我们可以得到一个标准的Conv-BatchNorm-ReLU结构的网络。
除了上面的例子,Network中的Block可以设置为任意仓库中实现的Block(nn_module/conv目录下的类)。
在上面的例子中,Conv2d也是一个Block,只是它不能再嵌套其它Block,所以我们将之称为Meta-Block,简称为M-Block。而ConvNormAct,它的参数conv允许它接收一个其它Block作为它自身的基础构件,所以它是可嵌套的Block,我们将之称为Nestable-Block,简称为N-Block。
Meta-Block简称为M-Block,它是指无法嵌套其它Block的Block。例如,在上面的例子中,Conv2d是一个M-Block,因为它无法再嵌套其它Block。
目前仓库中实现的M-Block只有两个:
- Conv2d:标准的2d卷积
- Conv2dTranspose:标准的2d转置卷积
Nestable-Block简称为N-Block,它是指可以嵌套其它Block的Block。例如,在上面的例子中,ConvNormAct是一个N-Block,因为我们可以通过设置它的“conv”参数来将其Block设置为任意仓库中实现的Block。
除了常规与卷积操作相关的参数,N-Block通常包含一个或多个conv参数,如下所示(以ConvNormAct为例):
def __init__(self, in_channels, out_channels, stride, norm=nn.BatchNorm2d, act=nn.ReLU, dropout=0.0, pre_act=False, conv=Conv2d):
可以将conv设置为任意其它Block来实现特定模型的设计。
概念本身很简单,但是脱离示意还是不太容易理解,所以下面先给出一个具体的ResNet示例,然后在示例中在详细介绍一些相关概念。