tf.nn,tf.layers, tf.contrib概述:
我们在使用tensorflow时,会发现tf.nn,tf.layers, tf.contrib模块有很多功能是重复的,尤其是卷积操作,在使用的时候,我们可以根据需要现在不同的模块。但有些时候可以一起混用。 下面是对三个模块的简述: (1)tf.nn :提供神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation。 (2)tf.layers:主要提供的高层的神经网络,主要和卷积相关的,个人感觉是对tf.nn的进一步封装,tf.nn会更底层一些。 (3)tf.contrib:tf.contrib.layers提供够将计算图中的 网络层、正则化、摘要操作、是构建计算图的高级操作,但是tf.contrib包含不稳定和实验代码,有可能以后API会改变。
以上三个模块的封装程度是逐个递进的。
tf.layers模块介绍:
Layers模块属于TensorFlow的一个稳定的中层API,其源码位于tensorflow/python/layers/layers.py,其官方文档地址为https://www.tensorflow.org/api_docs/python/tf/layers ref1
tf.layers这个中层API基本上可以算是tf.nn模块的抽象,可以极大地加快模型的构建速度。
tf.layers里面有很多封装好的类和函数。
tf.layers模块提供的API:
- 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(…): 二维深度可分离卷积层
1. input
tf.layers.Input() 这个方法是用于输入数据的方法,其实类似于 tf.placeholder,相当于一个占位符的作用,当然也可以通过传入 tensor 参数来进行赋值。Input这个类在1.8里面去除掉了。只能用tf.placeholder了, 所以在新版本中使用tf.placeholder是最好的选择
- 用法
Input(
shape=None,
batch_size=None,
name=None,
dtype=tf.float32,
sparse=False,
tensor=None
)
- 参数说明如下:
shape:可选,默认 None,是一个数字组成的元组或列表,但是这个 shape 比较特殊,它不包含 batch_size,比如传入的 shape 为 [32],那么它会将 shape 转化为 [?, 32],这里一定需要注意。
batch_size:可选,默认 None,代表输入数据的 batch size,可以是数字或者 None。
name:可选,默认 None,输入层的名称。
dtype:可选,默认 tf.float32,元素的类型。
sparse:可选,默认 False,指定是否以稀疏矩阵的形式来创建 placeholder。
tensor:可选,默认 None,如果指定,那么创建的内容便不再是一个 placeholder,会用此 Tensor 初始化。
返回值:
返回一个包含历史 Meta Data 的 Tensor。 - 实例:
x = tf.layers.Input(shape=[32])
print(x)
y = tf.layers.dense(x, 16, activation=tf.nn.softmax)
print(y)
首先我们用 Input() 方法初始化了一个 placeholder,这时我们没有传入 tensor 参数,然后调用了 dense() 方法构建了一个全连接网络,激活函数使用 softmax,然后将二者输出,结果如下:
Tensor("input_layer_1:0", shape=(?, 32), dtype=float32)
Tensor("dense/Softmax:0", shape=(?, 16), dtype=float32)
这时我们发现,shape 它给我们做了转化,本来是 [32],结果它给转化成了 [?, 32],即第一维代表 batch_size,所以我们需要注意,在调用此方法的时候不需要去关心 batch_size 这一维。
如果我们在初始化的时候传入一个已有 Tensor,例如:
data = tf.constant([1, 2, 3])
x = tf.layers.Input(tensor=data)
print(x)
结果如下:
Tensor("Const:0", shape=(3,), dtype=int32)
可以看到它可以自动计算出其 shape 和 dtype。
2. batch_normalization
此方法是批量标准化的方法,经过处理之后可以加速训练速度,其定义在 tensorflow/python/layers/normalization.py,论文可以参考:http://arxiv.org/abs/1502.03167“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”。
- 用法
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=