Skip to content

3. Networks

civ2018 edited this page Dec 2, 2023 · 8 revisions

这一部分介绍目前实现的所有Network。如果对此处Network的含义不太清楚,请参考DL‐Theory‐Practice 简介

一个Network通常是由某种特定网络经抽象而得到。例如后续3.3小节中的VGG和3.4小节中的DiracNet,不能把它们当做是VGG和DiracNet的具体网络实现,而是要看作是由VGG和DiracNet受启发,抽象而出的更通用的结构。

不同的抽象力度往往也会得到不同的抽象结果。对于上面提到的VGG(3.3小节)和DiracNet(3.4小节),如果进一步抽象,可以构建一个更通用(当然也更复杂、更难理解)的Network。为了避免总是纠结于应该抽象到何种程度为适,目前仓库采用的原则是:尽可能提高通用性,但不能影响代码的可读性。也可从实用角度来理解:目前的抽象程度主要是为了方便实现我们希望实现的那些具体网络结构,而不是去覆盖各种各样的情况

这部分会首先介绍一些由特定网络结构抽象出的Network,并在最后介绍一种非常通用的GeneralNetwork。GeneralNetwork写法更复杂,但功能强大很多。合理使用GeneralNetwork,可以实现更多特异化的网络结构。

如果当前抽象无法满足大家常用需求,比如缺少一些功能,可以提issue或知乎私信。

所有Network代码都在目录:classification/models(其中的Inception因为一些特殊原因,没有适配到当前框架中,后续会处理)。

3.1 PlainNet

Source:classification/models/plainnet.py

PlainNet

PlainNet是最简单、也最常用的Network,它的特性如下

  1. 仅由同一种Block堆叠而成。
  2. 卷积部分的输出经GlobalAveragePool层输入至全连层。

PlainNet的参数包括

  • in_channels:输入通道数,默认为3。
  • hidden_channels:第一个Part的输出通道数,默认为64。
  • n_blocks_list:列表,定义每个Part中的Block数量。列表长度等于Part数量,默认为[2, 2, 2, 2]。
  • stride_list:列表,定义每个Part的步长。长度需要与n_blocks_list一直,默认为[2, 1, 1, 1]。
  • stride_factor:int或list。当为int时,定义了步长不为1的Part的通道缩放倍率(注意:步长为1的Part不受该值影响,其通道缩放倍率始终为1,即通道数不变)。当为list时,列表长度需要与n_blocks_list保持一致。列表中每一个值定义了对应Part的通道缩放倍率。在这种情况下,即使某个Part的步长为1,它的通道缩放倍率也受stride_factor参数中对应位置数值的影响。注意,当stride_factor为列表时,它的第一个值不起任何作用,因为第一个Part的通道变换数由参数hidden_channels确定。
  • num_classes:分类标签数量。当num_classes<=0时,不会添加额外的GlobalAveragePool层和全连层(图中虚线所示),这种用法经常出现在将网络作为其它任务的主干网络时。
  • last_act:作用于最后一个Part的输出上的激活函数(图中未画出)。必填,常用last_act=IdentityAct
  • conv:使用的Block。必填
  • out_feats:列表,用来指定网络输出特定层的feature map。在分类任务中,通常将其设置为out_feats=None,此时网络的输出是一个经全连层处理后的tensor。在其它任务中(如目标检测),当需要网络作为backbone输出不同尺度的特征图时,可以使用该参数指定特定的网络层。例如,使用设置out_feats=[0, 2]将会得到一个输出dict,可用key “layer_0”、“layer_2”来获取对应的feature map。除此,输出的dict中会额外添加“layer_last”来存放backbone输出的最后一层。

3.2 PlainOANet

Source:classification/models/plainnet.py

PlainOANet

PlainOANet是PlainNet的一个简单改版,它的名字含义是:PlainNet with One Additional Layer,OA就是这么来的(有点随意)。PlainOANet的特性如下

  1. PlainOANet的Part1使用Block conv1,而余下的Part都使用Block conv2。
  2. 在conv1之后,可选择是否加入一个MaxPool层。

PlainNet的参数包括:

  • in_channels:输入通道数,默认为3。
  • hidden_channels:第一个Part的输出通道数,默认为64。
  • n_blocks_list:列表,定义每个Part中的Block数量。列表长度等于Part数量,默认为[2, 2, 2, 2]。
  • stride_list:列表,定义每个Part的步长。长度需要与n_blocks_list一致,默认为[2, 1, 1, 1]。
  • stride_factor:int或list。当为int时,定义了步长不为1的Part的通道缩放倍率(注意:步长为1的Part不受该值影响,其通道缩放倍率始终为1,即通道数不变)。当为list时,列表长度需要与n_blocks_list保持一致。列表中每一个值定义了对应Part的通道缩放倍率。注意,当stride_factor为列表时,它的第一个值不起任何作用,因为第一个Part的通道变换数由参数hidden_channels确定。
  • num_classes:分类标签数量。当num_classes<=0时,不会添加额外的全连层。默认值为10。
  • last_act:作用于最后一个Part的输出上的激活函数(图中未画出)。必填,常用last_act=IdentityAct
  • use_pool:是否在第一个Part之后加入MaxPool。如为True,则加入一个Kernel_size=3,stride=2,padding=1的MaxPool层;如为False,则不加。默认值为True。
  • conv1:使用的Block 1。必填
  • conv2:使用的Block 2。必填
  • out_feats:列表,用来指定网络输出特定层的feature map。在分类任务中,通常将其设置为out_feats=None,此时网络的输出是一个经全连层处理后的tensor。在其它任务中(如目标检测),当需要网络作为backbone输出不同尺度的特征图时,可以使用该参数指定特定的网络层。例如,使用设置out_feats=[0, 2]将会得到一个输出dict,可用key “layer_0”、“layer_2”来获取对应的feature map。除此,输出的dict中会额外添加“layer_last”来存放backbone输出的最后一层。

3.3 VGG

Source:classification/models/vgg.py

VGG

VGG的每一个Part由多个conv构成,并在Part的最后使用MaxPool。在VGG结构中,尺寸变换由MaxPool层完成;通道变换由conv层完成。与大多数Network最后使用GlobalAveragePool不同,VGG最后使用flatten直接将卷积层输出的feature map拉平。所以VGG中需要人为指定全连层的输入。

VGG的参数包括:

  • in_channels:输入通道数,默认为3。
  • hidden_channels:第一个Part的输出通道数,默认为64。
  • n_blocks_list:列表,定义每个Part中的Block数量。列表长度等于Part数量,默认为[2, 2, 2, 2]。
  • stride_list:列表,定义每个Part的步长。长度需要与n_blocks_list一直,默认为[2, 1, 1, 1]。
  • stride_factor:int或list。当为int时,定义了步长不为1的Part的通道缩放倍率(注意:步长为1的Part不受该值影响,其通道缩放倍率始终为1,即通道数不变)。当为list时,列表长度需要与n_blocks_list保持一致。列表中每一个值定义了对应Part的通道缩放倍率。注意,当stride_factor为列表时,它的第一个值不起任何作用,因为第一个Part的通道变换数由参数hidden_channels确定。
  • pool_size:MaxPool层使用的kernel_size,默认值为3。
  • fc_in_dim:第一个FC层的输入维度,默认值为1024。
  • fc_out_dim:第一个FC层的输出维度,默认值为4096。
  • num_classes:分类标签数量。当num_classes<=0时,不会添加额外的全连层。默认值为10。
  • last_act:作用于最后一个Part的输出上的激活函数(图中未画出)。必填,常用last_act=IdentityAct
  • conv:使用的Block。必填
  • out_feats:列表,用来指定网络输出特定层的feature map。在分类任务中,通常将其设置为out_feats=None,此时网络的输出是一个经全连层处理后的tensor。在其它任务中(如目标检测),当需要网络作为backbone输出不同尺度的特征图时,可以使用该参数指定特定的网络层。例如,使用设置out_feats=[0, 2]将会得到一个输出dict,可用key “layer_0”、“layer_2”来获取对应的feature map。除此,输出的dict中会额外添加“layer_last”来存放backbone输出的最后一层。

3.4 DiracNet

Source:classification/models/diracnet.py

DiracNet

DiracNet的特性如下:

  1. DiracNet由一个固定的conv作为网络的第一层,它是Part1之前的额外一层,所以不受参数影响。
  2. DiracNet的每一个Part(除了最后一个)由多个Block构成,并在每个Part的最后接一个MaxPool。
  3. 每个Part中Feature map的尺度变换由MaxPool层完成;通道变换由Part中的第一个卷积层完成。
  4. 网络的最后一个Part之后不接MaxPool。当用作分类时,使用GlobalAveragePool层卷积层输出至全连层。

DiracNet的参数包括:

  • in_channels:输入通道数,默认为3。
  • hidden_channels:第一个Part的输出通道数,默认为64。
  • n_blocks_list:列表,定义每个Part中的Block数量。列表长度等于Part数量,默认为[2, 2, 2, 2]。
  • stride_list:列表,定义每个Part的步长。长度需要与n_blocks_list一直,默认为[2, 1, 1, 1]。
  • stride_factor:int或list。当为int时,定义了步长不为1的Part的通道缩放倍率(注意:步长为1的Part不受该值影响,其通道缩放倍率始终为1,即通道数不变)。当为list时,列表长度需要与n_blocks_list保持一致。列表中每一个值定义了对应Part的通道缩放倍率。注意,当stride_factor为列表时,它的第一个值不起任何作用,因为第一个Part的通道变换数由参数hidden_channels确定。
  • pool_size:MaxPool层使用的kernel_size,默认值为3。
  • num_classes:分类标签数量。当num_classes<=0时,不会添加额外的全连层。默认值为10。
  • last_act:作用于最后一个Part的输出上的激活函数(图中未画出)。必填,常用last_act=IdentityAct
  • conv:使用的Block。必填
  • out_feats:列表,用来指定网络输出特定层的feature map。在分类任务中,通常将其设置为out_feats=None,此时网络的输出是一个经全连层处理后的tensor。在其它任务中(如目标检测),当需要网络作为backbone输出不同尺度的特征图时,可以使用该参数指定特定的网络层。例如,使用设置out_feats=[0, 2]将会得到一个输出dict,可用key “layer_0”、“layer_2”来获取对应的feature map。除此,输出的dict中会额外添加“layer_last”来存放backbone输出的最后一层。
Clone this wiki locally