获取VGG中间层的输出结果
VGG结构
VGG的结构根据其网络层数的深度,分为四种,分别为11,13,16,19.这四种对应的网络结构的配置的声明见下。
defaultcfg = {
11 : [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512],
13 : [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512],
16 : [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512],
19 : [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512],
}
其具体的结构见下图。配置里面主要储存本层的对应的in_channels.
代码
因为VGG网络可以训练很多数据集,一般数据集的label的种类是不同的,这个时候我们需要做的就是改变最后一层的fc的weight的输出维度。也就是通过这句来声明最后的输出结果。其中num_classes代表的是这个数据集对应的label的种类数。
self.classifier = nn.Linear(cfg[-1], num_classes)
总体的代码思路是,先配置4种VGG对应的结构信息,然后通过make_layers进行构建网络。代码如下。
import math
import torch
import torch.nn as nn
from torch.autograd import Variable
__all__ = ['vgg']
defaultcfg = {
11 : [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512],
13 : [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512],
16 : [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512],
19 : [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256