对VGG16 这类keras自带的网络分析有感,写在这里.
查看VGG16在keras中的说明文档,可以这样:
from keras.applications.vgg16 import VGG16
然后(在jupyter notebook, jupyter lab或Ipython中)
? VGG16
可查看VGG16的使用帮助.
Signature: VGG16(include_top=True, weights='imagenet', input_tensor=None, input_shape=None, pooling=None, classes=1000)
Docstring:
Instantiates the VGG16 architecture.
Optionally loads weights pre-trained on ImageNet. Note that when using TensorFlow, for best performance you should set `image_data_format='channels_last'` in your Keras config at ~/.keras/keras.json.
翻译:
可以加载在IMAGENET上预训练的权值. 当使用tensorflow作为backend时, 应该在keras.json中设置" `image_data_format='channels_last'.
The model and the weights are compatible with both TensorFlow and Theano. The data format convention used by the model is the one specified in your Keras config file.
翻译:
模型和权重文件在tensorflow和theano backend下都兼容. 但是数据格式的习惯需要在keras config文件中设置(如上).
# Arguments 参数介绍:
include_top: whether to include the 3 fully-connected layers at the top of the network.
weights: one of `None` (random initialization), 'imagenet' (pre-training on ImageNet),
or the path to the weights file to be loaded.
input_tensor: optional Keras tensor (i.e. output of `layers.Input()`)
to use as image input for the model.
input_shape: optional shape tuple, only to be specified
if `include_top` is False (otherwise the input shape
has to be `(224, 224, 3)` (with `channels_last` data format)
or `(3, 224, 224)` (with `channels_first` data format).
It should have exactly 3 input channels,
and width and height should be no smaller than 48.
E.g. `(200, 200, 3)` would be one valid value.
pooling: Optional pooling mode for feature extraction
when `include_top` is `False`.
- `None` means that the output of the model will be
the 4D tensor output of the
last convolutional layer.
- `avg` means that global average pooling
will be applied to the output of the
last convolutional layer, and thus
the output of the model will be a 2D tensor.
- `max` means that global max pooling will
be applied.
classes: optional number of classes to classify images
into, only to be specified if `include_top` is True, and
if no `weights` argument is specified.
# Returns
A Keras model instance.
# Raises
ValueError: in case of invalid argument for `weights`,
or invalid input shape.
File: c:\anaconda3\lib\site-packages\keras-2.1.5-py3.6.egg\keras\applications\vgg16.py
Type: function
- include_top: boolean (True or False)
是否包含最上层的全连接层. 因为VGGNET最后有三个全连接层, 因此,这个选项表示是否需要最上面的三个全连接层. 一般网络最后都会有全连接层, 最后一个全连接层更是设定了分类的个数, loss的计算方法, 并架设了一个概率转换函数(soft max). 其实soft max的作用就是将输出转换为各类别的概率,并计算loss.
可以这么说, 最上面三层使用来进行分类的, 其余层使用来进行特征提取的. 因此如果include_top=False,也就表示这个网络只能进行特征提取. 不能在进行新的训练或者在已有权重上fine-tune. - weights: ‘None’ / ‘imagenet’ / path (to the weight file)
None表示没有指定权重,对网络参数进行随机初始化.
‘imagenet’ 表示加载imagenet与训练的网络权重.
‘path’ 表示指向权重文件的路径.
VGG16 的框架是确定的, 而其权重参数的个数和结构完全由输入决定.
如果weight = None, 则输入尺寸可以任意指定,(范围不得小于48, 否则最后一个卷积层没有输出).
如果 weight = ‘imagenet’, 则输入尺寸必须严格等于(224,224), 权重的规模和结构有出入唯一决定, 使用了imagenet的权重,就必须使用训练时所对应的输入, 否则第一个全连接层的输入对接不上. (例如, 原来网络最后一个卷基层的输出为 300, 全连接层的神经元有1000个,则这里权重的结构为300X1000), 而其他的出入不能保证卷基层输出为300, 则对接不上会报错).
如果 weight = ‘path’, 则输入必须和path对应权值文件训练时的输入保持一致. - input_tensor: 图片tonsor输入项
- input_shape: tuple
如果include_top = False(表示用网络进行特征提取), 此时需要指定输入图片尺寸. 如果include_top = True(表示网路被用来进行重新训练或fine-tune), 则图片输入尺寸必须在有效范围内(width & height 大于48)或和加载权重训练时的输入保持一致. - pooling: 当include_top = False(网络被用于特征提取时改参数有效)
(纯自己理解, 可能有误).
最后一个卷基层的输出应该是一个4D的向量.(M,1,w’,h’), 其中w’和h’表示卷积过后得到的基本尺寸. 可以这样想象, 待卷积的目标是一个(N, w, h)的矩阵. 每卷积一次都是在这个矩阵的(n, w,h)上进行卷积, n表示卷积核的深度(2D=2, 3D=3). 最后依然会得到(M, w’,h’)这样一个维度的矩阵作为卷基层的输出. 把每一个2D的(w’, h’)看做一个维度, 那么最终输出就是4D的(M,1,w’,h’).那么:
pooling = None, 表示对输出的特征不作处理,依然是4D的.
pooling = ‘avg’, 表示在M维度进行平均, 最终得到的是一个(1,1,w’,h’)的特征输出.
pooling = ‘max’, 亦然. - classes: 要训练的类别数. 仅当include_top = True, 没有’weights’参数给定.(表示训练一个新网络)