程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

第三节,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-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
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-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(8100)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示