前言
在图像识别,目标检测等任务中经常用到预训练的模型,比如在VGG16模型结构(除去最后一层)的基础上加上多个softmax层用来分类。在SSD中用预训练的VGG16和ResNet50作为特征提取层。
当你用到包含全连接层的预训练模型时,就需要固定固定输入图片的大小。
池化层需要经过Flatten压扁之后,才能和全连接成相连。
如上图,经过最后一个池化层和Flatten后的输出矩阵形状为(800,1)
全连接层的前向传播是当前层的权重和上一层输出的乘积。
而权重矩阵的形状是固定的,上图中是(500x800)
因此(500,800)x(800,1) ===> 输出矩阵的shape:(500,1)
如果输入的尺寸不固定,无法前向传播。假设输入的56x56的图片,经过池化后输出(11x11)的特征图,Flatten后得到(1,6050)的形状,而下一层的权重是预训练的(500x800)的矩阵,因此无法计算,程序就会报错。
当然,也有特例,如SPPNet
SPPnet的提出就是为了解决全连接层的输入需要固定维度的问题。目标检测任务中,通过多尺度的ROI Pooling,使每个区域框都生成相同大小的特征向量,只要区域框的数量确定了,输入到全连接的特征向量的尺寸也就确定了,可以完成前向传播。
若全为卷积网络,则不需要固定大小。
因为卷积网络的参数之和卷积核的大小和输入输出的channel数有关,和图像的尺寸没关系。
因此,在一些深度学习框架中导入定义好的模型时,会提示你,如果包含顶部的全连接层,尺寸必须是固定的。
当include_top为True时,input_tensor必须为(224,224,3)
常见的预训练模型的参数
模型 | 大小 | Top1准确率 | Top5准确率 | 参数数目 | 深度 | 默认输入 |
---|---|---|---|---|---|---|
Xception | 88MB | 0.790 | 0.945 | 22,910,480 | 126 | 299x299 |
VGG16 | 528MB | 0.715 | 0.901 | 138,357,544 | 23 | 224x224 |
VGG19 | 549MB | 0.727 | 0.910 | 143,667,240 | 26 | 224x224 |
ResNet50 | 99MB | 0.759 | 0.929 | 25,636,712 | 168 | 224x224 |
InceptionV3 | 92MB | 0.788 | 0.944 | 23,851,784 | 159 | 299x299 |
IncetionResNetV2 | 215MB | 0.804 | 0.953 | 55,873,736 | 572 | 299x299 |
MobileNet | 17MB | 0.665 | 0.871 | 4,253,864 | 88 | 224x224 |