需要掌握:VGG16
概述
keras的VGG16 模型,权值由 ImageNet 训练而来
该模型可同时构建于 channels_first (通道,高度,宽度) 和 channels_last (高度,宽度,通道)两种输入维度顺序。
模型默认输入尺寸是 224x224,详见下面的 权重注意
官方api:
https://www.tensorflow.org/api_docs/python/tf/keras/applications/VGG16
中文api:
https://keras.io/zh/applications/#vgg16
语法
tf.keras.applications.VGG16(
*args,
**kwargs
)
参数
include_top=True:是否包括全连接层,即:Dense层
weights=
'imagenet':权重初始化方式input_tensor=None:可选,Keras tensor 作为模型的输入(即 layers.Input() 输出的 tensor)
input_shape=None:可选,输入尺寸元组,仅当 include_top=False 时有效,否则输入形状必须是 (224, 224, 3)(对于 channels_last 数据格式),或者 (3, 224, 224)(对于 channels_first 数据格式)。它必须拥有 3 个输入通道,且宽高必须不小于 32。例如 (200, 200, 3) 是一个合法的输入尺寸。
pooling=None:可选,当 include_top 为 False 时,该参数指定了特征提取时的池化方式。
- None 代表不池化,直接输出最后一层卷积层的输出,该输出是一个四维张量。
- ‘avg’ 代表全局平均池化(GlobalAveragePooling2D),相当于在最后一层卷积层后面再加一层全局平均池化层,输出是一个二维张量。
- ‘max’ 代表全局最大池化
classes=1000:可选,图片分类的类别数,仅当 include_top 为 True 并且不加载预训练权值时可用。
返回值
- Model 对象。
权重文件
下载地址
https://github.com/fchollet/deep-learning-models/releases
默认保存位置
windows:
C:\Users\当前登录用户名\.keras\modelslinux、mac:
~/.keras/models/
或者/Users/用户名/.keras/models
如果没有models文件夹,就创建一个
分类
权重文件分两类,一类是 包含 全连接层,一类是 不包含 全连接层
vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5:带有 notop 字样的,不包含 全连接层权重,当指定
include_top=False时加载该文件。否则报错vgg16_weights_tf_dim_ordering_tf_kernels.h5:包含 全连接层权重,当指定
include_top=True时加载该文件,否则报错
在使用时注意
指定
include_top=False时,加载 文件名中 带有 notop 字样的 权重文件,否则报错指定
include_top=True时,加载 文件名中 没有 notop 字样的 权重文件,否则报错
模型的属性
trainable
卷积层的参数是否可以训练
例子:
# 卷积层的参数不可以训练
covn_base.trainable=False
层 属性
trainable
该层的参数是否可以训练
例子:
covn_base=tf.keras.applications.VGG16(include_top=True,weights=vgg16_weight_path)
for layer in covn_base.layers[:-5]:
layer.trainable=False
后面5层的参数随着训练会改变,前面n层的参数都不改变
例子
# 权重路径
vgg16_weight_path=r'../input/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5'
# 加载vgg16模型
covn_base=tf.keras.applications.VGG16(include_top=True,weights=vgg16_weight_path)
covn_base.summary()
# 卷积层参数不可训练
covn_base.trainable=False
# 将vgg16模型的 卷积层 添加到新模型中(不包含全连接层)
model=tf.keras.Sequential()
for item in covn_base.layers[:-4]:
model.add(item)
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(512,activation="relu"))
model.add(tf.keras.layers.Dense(1,activation="sigmoid"))
model.summary()