TensorFlow中层API: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里面有很多封装好的类和函数。
类:
密集连接类
Dropout类
卷积类
- Conv1D
- Conv2D
- Conv3D
BN类
解卷积类(卷积转置)
- Conv2DTranspose
- Conv3DTranspose
平均池化类
- AveragePooling1D
- AveragePooling2D (e.g. images)
- AveragePooling3D (e.g. volumes)
最大池化类
- MaxPooling1D
- MaxPooling2D
- MaxPooling3D
Flatten类
深度可分离卷积
- SeparableConv1D 一维深度可分离卷积层
- SeparableConv2D 两维深度可分离卷积层
其他类
函数:
这里的函数其实是基于上面的类实现的
- average_pooling1d
- average_pooling2d
- average_pooling3d
- batch_normalization
- conv1d
- conv2d
- conv2d_transpose
- conv3d
- conv3d_transpose
- dense
- dropout
- flatten
- max_pooling1d
- max_pooling2d
- max_pooling3d
- separable_conv1d
- separable_conv2d
类详解
1.Input
tf.layers.Input用于输入数据的类,有点类似于tf.plcaeholder,相当于一个占位符作用
#用法
Input = tf.layers.Input(dtype=tf.float32, shape=[None, 224, 224, 3])
#Input这个类在1.8里面去除掉了。只能用tf.placeholder了
#所以在新版本中使用tf.placeholder是最好的选择
2.Dense
Dense,即全连接网络。
#用法
Input = tf.placeholder(tf.float32,[None,784])
x = tf.layers.Dense(1000, activation=tf.nn.relu, name='fc')(Input)
3.Dropout
Dropout:在训练过程中,对于神经网络units,按照一定的概率将其暂时从网络丢弃,可以用来防止过拟合
#用法
tf.layers.Dropout(rate=0.5, #rate=0.1 will drop out 10% of input units
noise_shape=None, #这个主要用于feature maps的上多个feature map dropout掉相同的unit,如果不懂,请help,里面有详细解释
seed=None,
name=None)
Input = tf.placeholder(tf.float32,[None,784])
x = tf.layers.Dropout(rate=0.4, noise_shape=[None,224,224,1])(Input, training=True) # 三个channel dropout掉相同位置的unit
#training设置为True,dropout起作用,设置为Flase,dropout将不起作用。
x = tf.layers.Dropout(rate=0.4)(Input, training=True)
4.Conv2D
Conv2D为二维卷积,另外还有一维和三维卷积。
'''Conv2D参数'''
tf.layers.Conv2D(filters,
kernel_size,
strides=(1,1),
padding='valid',
activation=None,
use_bias=True,
kernel_regularizer=None, #施加在权重上的正则项
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None, #施加在权重上的约束项
bias_constraint=None, #施加在偏置上的约束项
trainable=True, # True时,则将变量添加到 GraphKeys.TRAINABLE_VARIABLES(即tf.trainable_variables())
name=None)
#Conv2D的例子
Input = tf.placeholder(tf.float32,[None,224,224,3])
x = tf.layers.Conv2D(16, [3,3], strides=(1,1), padding='valid', activation=tf.nn.relu, name='conv')
5.AveragePooling2D
2维平均池化
6.MaxPooling2D
MaxPooling2D为2维最大池化
7.Flatten
Flatten对Tensor进行展平操作。
inputs = tf.placeholder(tf.float32,[None, 7, 7, 16])
x = tf.layers.Flatten(name='flatten')(inputs)
8.BatchNormalization
BatchNormalization批量标准化,经过BN之后,可以加速训练速度
inputs = tf.placeholder(tf.float32, [None,56,56,64])
x = tf.layers.BatchNormalization()(inputs, training=True)
#使用了BN后,要做如下操作
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
train_op = tf.train.AdamOptimizer().minimize(cost)
9.Conv2DTranspose
Conv2DTranspose为二维反卷积,顾明思义即卷积的反向操作,即输入卷积的结果,得到卷积前的结果。
'''Conv2DTranspose参数'''
tf.layers.Conv2DTranspose(filters,
kernel_size,
strides=(1, 1),
padding='valid',
activation=None,
use_bias=True,
kernel_initializer=None,
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None)
Input = tf.placeholder(tf.float32,[None,112,112,16])
x = tf.layers.Conv2DTranspose(filters=3,
kernel_size=2,
strides=2)(Input)
10.SeparableConv2D
SeparableConv2D performs a depthwise convolution that acts separately on
channels, followed by a pointwise convolution that mixes channels.
假设有一个3x3的卷积层,其输入通道为16,输出通道为32。计算是这样完成的:32个3x3卷积核会遍历16个输入通道的数据,从而产生16x32=512个特征图谱。然后按卷积核进行叠加,将512个特征图谱融合得到32个特征图谱。
同样,输入通道为16,输出通道为32,卷积核为3x3。深度可分离卷积的计算如下:用1个3x3卷积核遍历16个输入通道,得到16个特征图谱;然后用32个1x1卷积核遍历这16个特征图谱,得到32个特征图谱。
上面的深度乘数为1,这也是这类网络层当前的通用参数。
这么做是为了对空间信息和深度信息进行去耦。从Xception模型的效果可以看出,这种方法是比较有效的。由于能够有效利用参数,因此深度可分离卷积也可以用于移动设备中。
11.Layer
函数详解
Layers里的函数其实是上面的类实例化,得到的,所以这里就不一一介绍了。不懂请help( )。