我们在使用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会改变。
1) 如果只是想快速了解一下大概,不建议使用tf.nn.conv2d类似的函数,可以使用tf.layers和tf.contrib.layers高级函数
2) 当有了一定的基础后,如果想在该领域进行深入学习,建议使用tf.nn.conv2d搭建神经网络,此时会帮助你深入理解网络中参数的具体功能与作用,而且对于loss函数需要进行正则化的时候很便于修改。
且能很清晰地知道修改的地方。而如果采用tf.layers和tf.contrib.layers高级函数,由于函数内部有正则项,此时,不利于深入理解。而且如果编写者想自定义loss,此时比较困难,如如果读者想共享参数时,此时计算loss函数中的正则项时,应该只计算一次,如果采用高级函数可能不清楚到底如何计算的。
功能 | tf.nn | tf.layers | tf.contrib | 功能介绍 |
卷积运算(conv) | conv2d(...) | conv2d(...) | layers.convolution2d | 2D卷积层的功能界面 |
池化(pooling) | avg_pool(...) max_pool(...) |
average_pooling2d(...) max_pooling2d(...) |
layers.avg_pool2d layers.max_pool2d |
2D输入的平均和最大池层(例如图像) |
全连接(dense) | dense(...) | layers.fully_connection |
密集连接层的功能接口 | |
退出率 | dropout(...) | dropout(...) | 有助于防止过度拟合 | |
展平 | flatten(...) | layers.flatten | 在保留axis (axis 0)的同时平移输入张量 | |
批量标准化(BN) | batch_normalization(...) | BN通过一定的规范化手段,把每层神经网络任意神经元输入值的分布强行拉回到均值为0方差为1的标准正态分布 | ||
本地响应规范化(LRN) | local_response_normalization(...) | 局部响应归一化就是借鉴侧抑制的思想来实现局部抑制 |
(1)tf.nn.conv2d函数
tf.nn.conv2d(
input,
filter,
strides,
padding,
use_cudnn_on_gpu=True,
data_format='NHWC',
dilations=[1, 1, 1, 1],
name=None
)
函数作用:对输入数据进行二维卷积操作
参数说明:
返回:
输出张量。
(2)tf.layers.conv2d
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=,
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None)
函数作用:
2D卷积层(例如,图像上的空间卷积)。
该层创建卷积内核,该卷积内核与层输入卷积混合(实际上是交叉关联)以产生输出张量.如果use_bias为True(并且提供了bias_initializer ),则创建偏置向量并将其添加到输出。最后,如果activation不是None,它也会应用于输出。
参数说明:
strides
不等于1 和 dilation_rate
不等于1 这两种情况不能同时存在。"valid"
表示不够卷积核大小的块就丢弃,"same"
表示不够卷积核大小的块就补0。strides
不等于1 和 dilation_rate
不等于1 这两种情况不能同时存在。Optimizer
更新后应用到核上。Optimizer
用来实现对权重矩阵的范数约束或者值约束。映射函数必须将未被影射的变量作为输入,且一定输出映射后的变量(有相同的大小)。做异步的分布式训练时,使用约束可能是不安全的。返回:
输出张量。
池化:池化层的主要目的是通过降采样的方式,在不影响图像质量的情况下,压缩图片,减少参数。子采样有两种形式,一种是均值子采样,即是对一个区域里的元素求平均值;另一种就是最大值采样,即是在一个区域中寻找最大值,如下图所示。
(1)tf.nn.avg_pool和tf.nn.max_pool
# 平均池化
tf.nn.avg_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
# 最大化池化
tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
函数作用:
对输入进行池化操作
参数说明:
返回:
由data_format指定格式的Tensor,池化输出张量。
(2)tf.layers.max_pooling2d和tf.layers.average_pooling2d
#最大池化
tf.layers.max_pooling2d(inputs,pool_size,strides,padding='valid',data_format='channels_last',name=None)
#平均池化
tf.layers.average_pooling2d(inputs,pool_size,strides,padding='valid',data_format='channels_last',name=None)
函数作用:
用于2D输入的池化层(例如图像)。
参数:
返回:
输出张量。
(1)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
)
参数:
该层实现了操作:outputs = activation(inputs * kernel + bias),其中activation是作为activation参数传递的激活函数(如果不是None),是由层创建的权重矩阵,kernel是由层创建的权重矩阵,并且bias是由层创建的偏差向量(只有use_bias为True时).
(2)tf.contrib.layers.fully_connection
tf.contrib.layers.fully_connection(F,num_output,activation_fn)
这个函数就是全链接成层,F是输入,num_output是下一层单元的个数,activation_fn是激活函数
(1)dropout
1)tf.nn.dropout
tf.nn.dropout( x, keep_prob, noise_shape=None, seed=None, name=None )
该函数用于计算dropout.
使用概率keep_prob,输出按照1/keep_prob的比例放大输入元素,否则输出0.缩放是为了使预期的总和不变.
默认情况下,每个元素都是独立保留或删除的。如果已指定noise_shape,则必须将其广播为x的形状,并且只有具有noise_shape[i] == shape(x)[i]的维度才作出独立决定.
例如,如果shape(x) = [k, l, m, n]并且noise_shape = [k, 1, 1, n],则每个批处理和通道组件将独立保存,并且每个行和列将保留或不保留在一起.
参数:
返回:
该函数返回与x具有相同形状的Tensor.
2)tf.layers.dropout
tf.layers.dropout(inputs,rate=0.5,noise_shape=None,seed=None,training=False,name=None)
将Dropout(退出率)应用于输入.
Dropout包括在每次更新期间随机将输入单位的分数rate设置为0,这有助于防止过度拟合(overfitting).保留的单位按比例1 / (1 - rate)进行缩放,以便在训练时间和推理时间内它们的总和不变.
参数:
返回: 经过 dropout 层之后的 Tensor。
对于这两个方法有一下几点区别: