之前写的代码都是基于比较底层的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(
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
)
参数解释:
"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).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
)
参数解释:
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
)
参数说明如下:
channels_last
,分为 channels_last
和 channels_first
两种模式,代表了输入数据的维度类型,如果是 channels_last
,那么输入数据的 shape 为 (batch, height, width, channels)
,如果是 channels_first
,那么输入数据的 shape 为 (batch, channels, height, width)
。tf.layers.dropout(
inputs,
rate=0.5,
noise_shape=None,
seed=None,
training=False,
name=None
)
参数解释:
tf.pad(
tensor,
paddings,
mode='CONSTANT',
name=None,
constant_values=0
)
这里我们使用tf.layers
提供的API来实现简单的CNN分类MNIST任务。
例子的代码地址为:LearningTensorFlow/23.tf.layers/
一个项目分为单个部分