tf.keras.applications.VGG16

需要掌握: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':权重初始化方式

    • None: 随机初始化
    • 'imagenet' :加载在 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\models

  • linux、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()

原文出处:/show_1EF4cJOvhrva.html