2.2 Pooling Layer 池化层
在卷积层之后,通常在CNN层之间添加池化层。池化的功能是不断降低维数,以减少网络中的参数和计算次数。这缩短了训练时间并控制过度拟合。
最常见的池类型是max pooling,它在每个窗口中占用最大值。需要事先指定这些窗口大小。这会降低特征图的大小,同时保留重要信息。
Max Pooling主要的好处是当图片整个平移几个Pixel的话对判断上完全不会造成影响,以及有很好的抗杂讯功能。
池化层 示意图 1
池化层 示意图 2
2.3 Fully Connected Layer 全连接层
基本上全连接层的部分就是将之前的结果平坦化之后接到最基本的神经网络了
3 利用CNN识别MNIST手写字体
下面这部分主要是关于如何使用tensorflow实现CNN以及手写字体识别的应用
# CNN 代码 def convolutional(x,keep_prob): def conv2d(x,W): return tf.nn.conv2d(x,W,[1,1,1,1],padding='SAME') def max_pool_2x2(x): return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') def weight_variable(shape): initial=tf.truncated_normal(shape,stddev=0.1) return tf.Variable(initial) def bias_variable(shape): initial=tf.constant(0.1,shape=shape) return tf.Variable(initial) x_image=tf.reshape(x,[-1,28,28,1]) W_conv1=weight_variable([5,5,1,32]) b_conv1=bias_variable([32]) h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1) h_pool1=max_pool_2x2(h_conv1) W_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bias_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) h_pool2 = max_pool_2x2(h_conv2) # full_connetion W_fc1=weight_variable([7*7*64,1024]) b_fc1=bias_variable([1024]) h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64]) h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1) # dropout 随机扔掉一些值,防止过拟合 h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob) W_fc2=weight_variable([1024,10]) b_fc2=bias_variable([10]) y=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2) return y,[W_conv1,b_conv1,W_conv2,b_conv2,W_fc1,b_fc1,W_fc2,b_fc2]
大家稍微对tensorflow的代码有些基础,理解上面这部分基本上没有难度,并且基本也是按照我们前面概念图中的逻辑顺序实现的。
最终按照慕课网上的学习资料TensorFlow与Flask结合打造手写体数字识别,实现了一遍CNN,比较曲折的地方是前端,以及如何将训练的模型与flask整合,最后项目效果如下:
来源 https://github.com/yanqiangmiffy/TensorFlow-MNIST-WEBAPP
欢迎大家到GitHub fork和star,项目传送门--->TensorFlow-MNIST-WEBAPP
4 总结
最后说自己的两点感触吧:
- CNN在各种场景已经应用很成熟,网上资料特别多,原先自己也是略知一二,但是从来没有总结整理过,还是整理完之后心里比较踏实一些。
- 切记理论加实践,实现一遍更踏实。
5 参考资料
- [資料分析&機器學習] 第5.1講: 卷積神經網絡介紹(Convolutional Neural Network)
- An Intuitive Explanation of Convolutional Neural Networks – the data science blog
- Convolutional Neural Network (CNN) | Skymind
- Convolutional Neural Networks (LeNet) — DeepLearning 0.1 documentation
- CS231n Convolutional Neural Networks for Visual Recognition
- 卷积神经网络(CNN)学习笔记1:基础入门 | Jey Zhang
- Deep Learning(深度学习)学习笔记整理系列之(七) - CSDN博客