使用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会改变。

Batch normalization(BN):

tensorflow中提供了三种BN方法:​​javascript:void(0)​


  • ​tf.nn.batch_normalization​
  • ​tf.layers.batch_normalization​
  • ​tf.contrib.layers.batch_norm​

以​​tf.layers.batch_normalization​​为例介绍里面所包含的主要参数:

tf.layers.batch_normalization(inputs, decay=0.999, center=True, scale=True, is_training=True, epsilon=0.001)

一般使用只要定义以下的参数即可:


  • inputs: 输入张量[N, H, W, C]
  • decay: 滑动平均的衰减系数,一般取接近1的值,这样能在验证和测试集上获得较好结果
  • center: 中心偏移量,上述的ββ ,为True,则自动添加,否则忽略
  • scale: 缩放系数,上述的γγ,为True,则自动添加,否则忽略
  • epsilon: 为防止除0而加的一个很小的数
  • is_training: 是否是训练过程,为True则代表是训练过程,那么将根据decay用指数滑动平均求得moments,并累加保存到​​moving_mean​​​和​​moving_variance​​中。否则是测试过程,函数直接取这两个参数来用。

如果是True,则需在训练的session中添加将BN参数更新操作加入训练的代码:


# execute update_ops to update batch_norm weights  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops):      optimizer = tf.train.AdamOptimizer(decayed_learning_rate)      train_op = optimizer.minimize(loss, global_step = global_step)


附官网链接:

​https://www.tensorflow.org/api_docs/python/tf/nn/batch_normalization​

​tf.contrib.layers.batch_norm | TensorFlow​

​tf.layers.batch_normalization | TensorFlow​


C/C++基本语法学习 STL C++ primer