之前写的代码都是基于比较底层的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(…): 二维深度可分离卷积层
二.常见函数说明
tf.layers.dense
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,
trainable=True,
name=None,
reuse=None
)
注意:
有激活函数,也有偏置量
- inputs: 输入数据,2维tensor.
- units: 该层的神经单元结点数。
- activation: 激活函数.
- use_bias: Boolean型,是否使用偏置项.
- kernel_initializer: 卷积核的初始化器.
- bias_initializer: 偏置项的初始化器,默认初始化为0.
- kernel_regularizer: 卷积核化的正则化,可选.
- bias_regularizer: 偏置项的正则化,可选.
- activity_regularizer: 输出的正则化函数.
- trainable: Boolean型,表明该层的参数是否参与训练。如果为真则变量加入到图集合中 GraphKeys.TRAINABLE_VARIABLES (see tf.Variable).
- name: 层的名字.
- reuse: Boolean型, 是否重复使用参数.
全连接层执行操作outputs=activation(inputs.kernel+bias)outputs=activation(inputs.kernel+bias)如果执行结果不想进行激活操作,则设置activation=None
#全连接层
dense1 = tf.layers.dense(inputs=pool3, units=1024, activation=tf.nn.relu)
dense2= tf.layers.dense(inputs=dense1, units=512, activation=tf.nn.relu)
logits= tf.layers.dense(inputs=dense2, units=10, activation=None)
也可以对全连接层的参数进行正则化约束:
dense1 = tf.layers.dense(inputs=pool3, units=1024, activation=tf.nn.relu,
kernel_regularizer=tf.contrib.layers.l2_regularizer(0.003))
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.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.pad
tf.pad(
tensor,
paddings,
mode='CONSTANT',
name=None,
constant_values=0
)
这里我们使用tf.layers提供的API来实现简单的CNN分类MNIST任务。
例子的代码地址为:LearningTensorFlow/23.tf.layers/