TensorFlow学习(十七):高级API之tf.layers

Posted 谢小小XH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow学习(十七):高级API之tf.layers相关的知识,希望对你有一定的参考价值。

之前写的代码都是基于比较底层的API了,底层的API其实是有好处的,虽然还是调API,但是至少对于原理有小小的理解才能够写出代码。而且在实现一些新的论文或者要实现一个新的点子的时候,这时候是没有API的,因此底层的API非常有存在的必要,且必须经过这一个过程。
但是对于一个非常熟悉底层原理和经过了写底层代码这个过程的人,在有些很常见的任务上,就是用高级封装好的API就行。tf.layers就是提供这个功能的。是用tf.layers封装好的函数,能够省去非常多自己写的代码,而且更加简单更加方便。
这里不会把所有的都罗列出来,因为用法都是差不多的。注意,使用的时候必须对于理论知识有了解

一.概览

官方文档:Module: tf.layers
tf.layers中分为类和函数,我们这里主要讲函数,因为类和函数的用法大同小异。

Input(…): 用于实例化一个输入 Tensor,作为神经网络的输入。
average_pooling1d(…): 一维平均池化层
average_pooling2d(…): 二维平均池化层
average_pooling3d(…): 三维平均池化层
batch_normalization(…): 批量标准化层
conv1d(…): 一维卷积层
conv2d(…): 二维卷积层
conv2d_transpose(…): 二维反卷积层
conv3d(…): 三维卷积层
conv3d_transpose(…): 三维反卷积层
dense(…): 全连接层
dropout(…): Dropout层
flatten(…): Flatten层,即把一个 Tensor 展平
max_pooling1d(…): 一维最大池化层
max_pooling2d(…): 二维最大池化层
max_pooling3d(…): 三维最大池化层
separable_conv2d(…): 二维深度可分离卷积层

看上面这个函数,可以发现,这个模块主要覆盖的区域是全连接和卷积等等的基本操作。但是这些操作已经非常足够了。我们可以根据自己的需要,在可以使用这里的API的时候使用,来简化我们的代码。

二.常见函数说明

上面讲了常见函数的概览,下面来详细讲一下常用的函数,其他的函数可以根据自己的需要查阅文档。

tf.layers.batch_normalization

此方法是批量标准化的方法,经过处理之后可以加速训练速度

tf.layers.batch_normalization(
    inputs,
    axis=-1,
    momentum=0.99,
    epsilon=0.001,
    center=True,
    scale=True,
    beta_initializer=tf.zeros_initializer(),
    gamma_initializer=tf.ones_initializer(),
    moving_mean_initializer=tf.zeros_initializer(),
    moving_variance_initializer=tf.ones_initializer(),
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    training=False,
    trainable=True,
    name=None,
    reuse=None,
    renorm=False,
    renorm_clipping=None,
    renorm_momentum=0.99,
    fused=None,
    virtual_batch_size=None,
    adjustment=None
)

参数解释:

  • inputs:必需,即输入数据。
  • axis: 一个整形或者一个整形列表。表示将要使用BN的轴。举个例子, 要是在一个数据格式为"channels_first" 2D卷积层的后面,那么设置set axis=1,否则设置axis=3. 要是提供了一个列表,那么列表中所有的维度都会被同时被BN。Note: when using multi-axis batch norm, the beta, gamma, moving_mean, and moving_variance variables are the same rank as the input Tensor, with dimension size 1 in all reduced (non-axis) dimensions).
  • momentum: 滑动平均的Momentum.
  • epsilon: 可选,默认 0.001,大于0的小浮点数,用于防止除0错误。
  • center: 可选,默认 True,若设为True,将会将 beta 作为偏置加上去,否则忽略参数 beta
  • scale: 可选,默认 True,若设为True,则会乘以gamma,否则不使用gamma。当下一层是线性的时,可以设False,因为scaling的操作将被下一层执行。
  • beta_initializer: 可选,默认 zeros_initializer,即 beta 权重的初始方法。
  • gamma_initializer: 可选,默认 ones_initializer,即 gamma 的初始化方法。
  • moving_mean_initializer: 可选,默认 zeros_initializer,即动态均值的初始化方法。
  • moving_variance_initializer: 可选,默认 ones_initializer,即动态方差的初始化方法。
  • beta_regularizer: 可选,默认None,beta 的正则化方法。
  • gamma_regularizer: 可选,默认None,gamma 的正则化方法。
  • beta_constraint:可选,默认None,加在 beta 上的约束项。
    -** gamma_constraint**: 可选,默认None,加在 gamma 上的约束项。
  • renorm: 可选,默认 False,是否要用 Batch Renormalization (https://arxiv.org/abs/1702.03275).
  • renorm_clipping: 可选,默认 None,是否要用 rmax、rmin、dmax 来 scalar Tensor。
  • renorm_momentum: 可选,默认 0.99,用来更新动态均值和标准差的 Momentum 值。
  • fused:可选,默认 None,是否使用一个更快的、融合的实现方法。
  • trainable: 可选,默认 False,返回结果是 training 模式。
  • virtual_batch_size:可选,默认 None,是一个 int 数字,指定一个虚拟 batch size。
  • adjustment: 可选,默认 None,对标准化后的结果进行适当调整的方法。
  • name: A string, the name of the layer.

tf.layers.dense

dense,即全连接网络,layers 模块提供了一个 dense() 方法来实现此操作

tf.layers.dense(
    inputs,
    units,
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)

参数解释

  • inputs:必需,即需要进行操作的输入数据。
  • units:必须,即神经元的数量。
  • activation:可选,默认为 None,如果为 None 则是线性激活。
  • use_bias:可选,默认为 True,是否使用偏置。
  • kernel_initializer:可选,默认为 None,即权重的初始化方法,如果为 None,则使用默认的 Xavier 初始化方法。
  • bias_initializer:可选,默认为零值初始化,即偏置的初始化方法。
  • kernel_regularizer:可选,默认为 None,施加在权重上的正则项。
  • bias_regularizer:可选,默认为 None,施加在偏置上的正则项。
  • activity_regularizer:可选,默认为 None,施加在输出上的正则项。
  • kernel_constraint,可选,默认为 None,施加在权重上的约束项。
  • bias_constraint,可选,默认为 None,施加在偏置上的约束项。
  • trainable:可选,默认为 True,布尔类型,如果为 True,则将变量添加到 GraphKeys.TRAINABLE_VARIABLES 中。
  • name:可选,默认为 None,卷积层的名称。
  • reuse:可选,默认为 None,布尔类型,如果为 True,那么如果 name 相同时,会重复利用。

tf.layers.conv2d

tf.layers.conv2d(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format='channels_last',
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)

参数说明如下:

  • inputs:必需,即需要进行操作的输入数据。
  • filters:必需,是一个数字,代表了输出通道的个数,即 output_channels。
  • kernel_size:必需,卷积核大小,必须是一个数字(高和宽都是此数字)或者长度为 2 的列表(分别代表高、宽)。
  • strides:可选,默认为 (1, 1),卷积步长,必须是一个数字(高和宽都是此数字)或者长度为 2 的列表(分别代表高、宽)。
  • padding:可选,默认为 valid,padding 的模式,有 valid 和 same 两种,大小写不区分。
  • data_format:可选,默认 channels_last,分为 channels_lastchannels_first 两种模式,代表了输入数据的维度类型,如果是 channels_last,那么输入数据的 shape 为 (batch, height, width, channels),如果是 channels_first,那么输入数据的 shape 为 (batch, channels, height, width)
  • dilation_rate:可选,默认为 (1, 1),卷积的扩张率,如当扩张率为 2 时,卷积核内部就会有边距,3×3 的卷积核就会变成 5×5。
  • activation:可选,默认为 None,如果为 None 则是线性激活。
  • use_bias:可选,默认为 True,是否使用偏置。
  • kernel_initializer:可选,默认为 None,即权重的初始化方法,如果为 None,则使用默认的 Xavier 初始化方法。
  • bias_initializer:可选,默认为零值初始化,即偏置的初始化方法。
  • kernel_regularizer:可选,默认为 None,施加在权重上的正则项。
  • bias_regularizer:可选,默认为 None,施加在偏置上的正则项。
  • activity_regularizer:可选,默认为 None,施加在输出上的正则项。
  • kernel_constraint,可选,默认为 None,施加在权重上的约束项。
  • bias_constraint,可选,默认为 None,施加在偏置上的约束项。
    trainable:可选,默认为 True,布尔类型,如果为 True,则将变量添加到 GraphKeys.TRAINABLE_VARIABLES 中。
  • name:可选,默认为 None,卷积层的名称。
  • reuse:可选,默认为 None,布尔类型,如果为 True,那么如果 name 相同时,会重复利用。

tf.layers.dropout

tf.layers.dropout(
    inputs,
    rate=0.5,
    noise_shape=None,
    seed=None,
    training=False,
    name=None
)

参数解释

  • inputs:必须,即输入数据。
  • rate:可选,默认为 0.5,即 dropout rate,如设置为 0.1,则意味着会丢弃 10% 的神经元。
  • noise_shape:可选,默认为 None,int32 类型的一维 Tensor,它代表了 dropout mask 的 shape,dropout mask 会与 inputs 相乘对 inputs 做转换,例如 inputs 的 shape 为 (batch_size, timesteps, features),但我们想要 droput - - mask 在所有 timesteps 都是相同的,我们可以设置 noise_shape=[batch_size, 1, features]。
  • seed:可选,默认为 None,即产生随机熟的种子值。
  • training:可选,默认为 False,布尔类型,即代表了是否标志位 training 模式。
  • name:可选,默认为 None,dropout 层的名称。
    返回: 经过 dropout 层之后的 Tensor。

tf.pad

tf.pad(
    tensor,
    paddings,
    mode='CONSTANT',
    name=None,
    constant_values=0
)

三.例子

这里我们使用tf.layers 提供的API来实现简单的CNN分类MNIST任务。
例子的代码地址为:LearningTensorFlow/23.tf.layers/

一个项目分为单个部分

以上是关于TensorFlow学习(十七):高级API之tf.layers的主要内容,如果未能解决你的问题,请参考以下文章

带你使用 TensorFlow 进行机器学习研究

发布TensorFlow 1.4

学习Tensorflow之基本操作

TensorFlow2.0教程-Keras 快速入门:用于构建和训练深度学习模型的高阶 API

TensorFlow入门8 -- 导入数据之Dataset机制

Tensorflow API 学习-tf.slice()