卷积神经网络(Convolutional Neural Networks,CNN)是个常用的神经网络构型,考虑了图像的结构信息,对MNIST的效果更好一些。CNN包含的主要操作:convolution和pooling在TF中都有对应的函数,直接构建网络即可。CNN的具体介绍很多,这里不再赘述。本文主要介绍TF的实现,包括一些主要函数、步骤的说明,先浏览一下程序:
一些说明:
1)偏置全部为0.1
ReLU是一个比较有效的激活函数“f(x)=max(x,0)“,只需要设置阈值,没有指数运算,导数就是1,运算速度快,梯度不饱和(什么是饱和:其他的函数接近两端时导数接近0,多层时梯度弥散)。按照经验:“用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为0的问题(dead neurons)”2)系数生成函数
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
截断正态分布,指定均值和方差,随机产生,如果偏离均值2个标准方差就丢弃重新采样。
tf.constant(value, dtype=None, shape=None, name='Const')
3)卷积函数
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
ininput是4D的,格式[batch, in_height, in_width, in_channels]
filter是一个在数据面上,在height、width方向滑动的板子,参数组[filter_height, filter_width, in_channels, out_channels],指明了模板的大小、输入输出通道数。
(注意:为了统一构型,输出的tensor可以看作堆叠的图像,这些函数按照API说明使用即可,详细的研究涉及C/C++数组在内存中的存储方式,基本上就是非常直观而高效的“指针满天飞“,而这些存储方式的理解,在后面tensor反转等操作时可能需要理解一下)
4)pool函数
tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
value就是构型为[batch, height, width, channels]的tensor, ksize是一个4元素向量,按照前面的顺序分别指明窗口在各个维度上的大小,strides是滑动步长也是基于前面的维度。其他的pool函数还有:
tf.nn.avg_pool
tf.nn.max_pool_with_argmax
tf.nn.avg_pool3d
tf.nn.max_pool3d
这也是个常用的经验处理,直观地讲就是:训练的时候随机停止一些神经元的更新,目前没有理论解释为何这样会得出较好的结果(毕竟神经网络本身也还没有严格的理论),主要是从稀疏性、组合性等角度去解释。
定性给出一些结果:(没有严格测试,只测试了1、2次)
标准程序运行时间215.7s,准确率99.18%;没有dropout:245.3s,准确率98.96%,去除dropout后没有显著影响,估计是该问题的过拟合效应不明显。
参考:
激活函数:http://blog.csdn.net/u012526120/article/details/49149317
http://www.cnblogs.com/neopenx/p/4453161.html
dropout:http://blog.csdn.net/stdcoutzyx/article/details/4902244
官方手册:https://www.tensorflow.org/versions/r0.10/get_started/index.html
中文社区:http://www.tensorfly.cn/