第三节,TensorFlow 使用CNN实现手写数字识别(卷积函数tf.nn.convd介绍)
上一节,我们已经讲解了使用全连接网络实现手写数字识别,其正确率大概能达到98%,这一节我们使用卷积神经网络来实现手写数字识别,
其准确率可以超过99%,程序主要包括以下几块内容
- [1]: 导入数据,即测试集和验证集
- [2]: 引入 tensorflow 启动InteractiveSession(比session更灵活)
- [3]: 定义两个初始化w和b的函数,方便后续操作
- [4]: 定义卷积和池化函数,这里卷积采用padding,使得
- 输入输出图像一样大,池化采取2x2,那么就是4格变一格
- [5]: 分配输入x_和y_
- [6]: 修改x的shape
- [7]: 定义第一层卷积的w和b
- [8]: 把x_image和w进行卷积,加上b,然后应用ReLU激活函数,最后进行max-pooling
- [9]: 第二层卷积,和第一层卷积类似
- [10]: 全连接层
- [11]: 为了减少过拟合,可以在输出层之前加入dropout。(但是本例子比较简单,即使不加,影响也不大)
- [12]: 由一个softmax层来得到输出
- [13]: 定义代价函数,训练步骤,用Adam来进行优化
- [14]: 使用测试集样本进行测试
我们先来介绍一下卷积神经网络的相关函数:
1 卷积函数tf.nn.conv2d()
Tensorflow中使用tf.nn.conv2d()函数来实现卷积,其格式如下:
tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,name=None)
- input:指定需要做卷积的输入图像,它要求是一个Tensor,具有[batch,in_height,in_width,in_channels]这样的形状(shape),具体含义是"训练时一个batch的图片数量,图片高度,图片宽度,图片通道数",注意这是一个四维的Tensor,要求类型为float32或者float64.
- filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height,filter_width,in_channels,out_channels]这样的shape,具体含义是"卷积核的高度,卷积核的宽度,图像通道数,滤波器个数",要求类型与参数input相同。有一个地方需要注意,第三维in_channels,就是参数input中的第四维。
- strides:卷积时在图像每一维的步长,这是一个一维的向量,长度为4,与输入input对应,一般值为[1,x,x,1],x取步长。
- padding:定义元素边框与元素内容之间的空间。string类型的量,只能是"SAME"和“VALID”其中之一,这个值决定了不同的卷积方式。
- use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认是True.
- name:指定名字
该函数返回一个Tensor,这个输出就是常说的feature map。
注意:在卷积核函数中,padding参数最容易引起歧义,该参数仅仅决定是否要补0,因此一定要清楚padding设置为SAME的真正意义。在设SAME的情况下,只有在步长为1时生成的feature map才会与输入大小相等。
padding规则介绍:
padding属性的意义是定义元素边框与元素内容之间的空间。
在tf.nn.conv2d函数中,当变量padding为VALID和SAME时,函数具体是怎么计算的呢?其实是有公式的。为了方便演示,我们先来定义几个变量:
- 输入的尺寸中高和宽定义为in_height,in_width;
- 卷积核的高和宽定义成filter_height,filter_width;
- 输出的尺寸中高和宽定义成output_height,output_width;
- 步长的高宽定义成strides_height,strides_width;
1、VALID情况
输出宽和高的公式分别为:
output_width = (in_width - filter_width + 1)/strides_width (结果向上取整) output_height = (in_height - filter_height + 1)/strides_height (结果向上取整)
2、SAME情况
output_width = in_width/strides_width (结果向上取整)
output_height = in_height /strides_height (结果向上取整)
这里有一个很重要的知识点--补零的规则:
pad_height = max((out_height - 1)xstrides_height + filter_height - in_height,0) pad_width = max((out_width - 1)xstrides_width + filter_width - in_width,0) pad_top = pad_height/2 pad_bottom = pad_height - pad_top pad_left = pad_width/2 pad_right = pad_width - pad_left
- pad_height:代表高度方向要填充0的行数;
- pad_width:代表宽度方向要填充0的列数;
- pad_top,pad_bottom,pad_left,pad_right:分别表示上、下、左、右这4个方向填充0的行数、列数。
2 池化函数 tf.nn.max_pool()和tf.nn.avg_pool()
TensorFlow里池化函数如下:
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了