03:一文全解:使用Tensorflow搭建卷积神经网络CNN识别手写数字图片

2023-11-16

标签(空格分隔): 王小草Tensorflow笔记


笔记整理者:王小草
笔记整理时间:2017年2月25日
官方文档原文地址:https://www.tensorflow.org/get_started/mnist/pros
官方文档最近更新时间:2017年2月15日

欢迎机器学习,深度学习爱好者一起交流。
也欢迎关注我的喜马拉雅账号:”好吧我真的叫王草”。分享由集智俱乐部推出的两本好书:《科学的极致:漫谈人工智能》与《走进2050,注意力,互联网与人工智能》。


在上一篇笔记中介绍了用softmax去识别手写数字的图片,正确率只有92%。这篇笔记,仍然聚焦于同一个案例,但使用一个更复杂一点的模型来做训练:卷积神经网络(简称CNN)。从而正确率会到达99.2%。

关于卷积神经网络CNN在我之前的深度学习系列笔记中有详细介绍,欢迎阅读,在这里就不再赘述了。

1.数据准备

前面的过程与上一篇笔记一样:
1.导入tensorflow包
2.下载数据
3.创建会话
4.为输入的样本特征x与标签y建立占位符

代码如下,不再解释,不懂的可以看上一篇笔记

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 加载数据
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# 创建会话
sess = tf.InteractiveSession()

# 设置占位符
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])

2.初始化参数的方法封装

参数在训练中是会不断变更与优化的,所有为参数创建一组变量。因为在神经网络中每层都会有参数,一个一个去创建显然不科学,最好的方式是写一个function去封装创建参数变量的过程。在神经网络里涉及的参数仍然是2类:w,b.

# 创建w参数
def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

# 创建b参数
def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

以上代码中,tf.truncated_normal函数使得w呈正太分布,
stddev设置标准差为0.1。也就是说输入形状大小shape,输出标准差为0.1的正太分布的随机参数作为权重变量矩阵

对于参数b,使用了tf.constant()来创建一组指定大小的常数,常数值为0.1

在方法def中都分别初始化了这两个参数。

注意:在初始化参数的时候,也不是随便给一个值作为初始值的哈。模型对初始的参数是很敏感的,如果参数都很大,那么经过wx+b这个线性函数时,输出的值也会很大,若是经过tanh这个激活函数,输出的结果绝对值都几乎接近于1,也就是说每个神经元的输出都几乎相同,这完全违背了神经网络的初衷,事实上我们希望每个神经网络都能去学习一个不同的特征,他们的输出值应该是有差异的。另一方面,如果w值设置地太小了,经过线性函数wx+b的时候,wx可以忽略不计,于是线性函数的输出都约等于b,经过激活函数后的输出也几乎相同,又造成了神经元彼此雷同的尴尬局面呢。

对于参数b, 因为这里要使用的是RELU这个激活函数,所以最好设置成小一点的正数,从而来避免“神经元死亡”。RELU激活函数是,当输入大于0,则输出=输入值;若输入值小于0,则输出=0,想想,要是b是太大的负数,线性函数的输出也很有可能是负数,经过RELU之后就都变成0了。。。

3.创建卷积层与池化层的方法封装

Tensorflow也在卷积层与池化层给了很多灵活的操作。卷积层与池化层都需要设置一些超参数,比如步长,窗口大小,补全的边界等。那么我们该如何去定义边界,如何去选择步长呢?在这里我们选择使用步长为1,用0补全边界,故卷积层的输出与输入的数据大小是一致的。

在池化层中,使用2*2的窗口选取窗口中的最大值作为输出。

同样,一个神经网络会有很多个卷积层与池化层,我们不可能去一层一层写,为了使代码更简洁,最好将卷积层与池化层的创建封装成两个方法。如下:

# 创建卷积层,步长为1,周围补0,输入与输出的数据大小一样(可得到补全的圈数)
def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

# 创建池化层,kernel大小为2,步长为2,周围补0,输入与输出的数据大小一样(可得到补全的圈数)
def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding=
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

03:一文全解:使用Tensorflow搭建卷积神经网络CNN识别手写数字图片 的相关文章

  • 数据挖掘:银行评分卡制作——数据分箱、WOE、IV的意义

    在银行评分卡的项目中 通常都会需要把数据分箱 分箱后并不是对数据进行哑变量处理 而是用WOE值去替换 再放入模型中 学习的过程中会对这些操作有些疑问 比如 数据分箱有什么意义 WOE和IV值是干什么的 这里对这些数据处理的意义进行一个说明

随机推荐

  • [OpenAirInterface实战-6] :OAI在github中源代码的存放结构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 OpenAirInterface实战 6 OAI在github中源代码的存放结构 文火冰糖 王文兵 的博客 CSDN博客 目录 第1章 基本
  • Zookeeper的常见面试题

    1 Zookeeper 1 1 Zookeeper基本概念 Zookeeper作为一个优秀高效且可靠的分布式协调框架 ZooKeeper 在解决分布式数据一致性问题时并没有直接使用Paxos算法 而是专门定制了一致性协议叫做 ZAB Zoo
  • 芯片低功耗设计原则

    原则1 按照自顶向下 从架构级到门级 的方法 在不同设计层次上对功耗进行优化 设计层次越高 优化所能达到的效果越好 原则2 从系统级着眼全局 从细节处精打细算 从产品解决方案角度而不局限于芯片本身来进行功耗预算 并根据功耗的分析结果 优化系
  • xxl-job任务详解

    文章目录 任务管理 新增任务页面字段释义 1 1 路由策略 1 2 运行模式 BEAN模式 GLUE模式 1 3 阻塞处理策略 1 4 子任务ID 1 5 JobHandler 1 6 Cron 1 7 任务超时时间 任务操作 任务管理 新
  • labview与matlab接口,LabVIEW Comms与MATLAB®的互联接口

    为了复用现有的MATLAB 代码 LabVIEW Communications System Design Suite LabVIEW Comms 新增了MATLAB专用接口的功能 无线原型的开发者可使用已有的MATLAB函数或脚本 将其连
  • 图片占位符在线工具

    简介 在前端的开发中 有时需要加载各种尺寸的图片 而在开发阶段 这些真实的图片可能并未制作完成 因此 我们可以使用图片占位符工具生成假的图片进行替代 本文介绍一款十分灵活的图片占位符工具 您只需在调用API服务时修改图片尺寸参数就可以生成不
  • 机器学习入门教学——可解释性

    1 前言 近年来 机器学习模型被广泛地应用到现实生活中的一些重要领域 如面部识别 自动驾驶 语言处理和智慧医疗等 然而 机器学习模型就像一个黑盒子 给予一个输入 就能得到一个决策结果 但是我们并不知道模型是如何做决策的 因此 可解释性旨在帮
  • Struts2标签与jsp页面Java代码的值相互使用

    业务需求 Struts标签使用Jsp页面中的list的值 java代码使用Struts传来的值
  • 从ChatGPT与New Bing看程序员为什么要学习算法?

    文章目录 为什么要学习数据结构和算法 ChatGPT与NEW Bing 的回答 想要通关大厂面试 就不能让数据结构和算法拖了后腿 业务开发工程师 你真的愿意做一辈子CRUD boy吗 对编程还有追求 不想被行业淘汰 那就不要只会写凑合能用的
  • 51单片机PCA模块配置

    PCA模块是 可编程计数器阵列 的缩写 英文名称是 Programmable Counter Array 以下的说明均以SILICON LAB生产的C8051系列微型控制器为例 PCA包括1个16位 定时器 计数器 和5个 捕获 比较模块
  • 动态规划算法(背包问题)

    1 应用场景 背包问题 背包问题 有一个背包 容量为4磅 现有如下物品 1 要求达到的目标为装入的背包的总价值最大 并且重量不超出 2 要求装入的物品不能重复 2 动态规划算法介绍 1 动态规划 Dynamic Programming 算法
  • Python datetime模块中strptime和strftime的区别和使用方法

    strptime和strftime是两个比较容易搞混的函数 今天恰好用到 在这里做一个总结 strptime p表示parse 表示分析的意思 所以strptime是给定一个时间字符串和分析模式 返回一个时间对象 strftime f表示f
  • 【C++技能树】多态解析

    Halo 这里是Ppeua 平时主要更新C 数据结构算法 Linux与ROS 感兴趣就关注我bua 文章目录 0 多态的概念 0 1 多态的定义 1 重写 2 Final与Override 3 抽象类 4 多态中的内存分布 4 1虚表存在哪
  • 夜神模拟器-软件apk存放目录

    1 打开文件管理器 2 点sdcard 3 点tencent 4 点tassistant 5 点apk 6 我们下载好的apk就在这个位置 我们每安装好这个apk后 包将会被自动删除 所以图片中没有显示
  • JUC常用类解析

    CountDownLatch类 CountDownLatch 英文翻译为倒计时锁存器 是一个同步辅助类 在完成一组正在其他线程中执行的操作之前 它允许一个或多个线程一直等待 CountDownLatch有一个正数计数器 countDown
  • Mysql的物理文件组成

    一 日志文件 1 1 错误日志 记录了mysql运行过程中较为严重的错误信息 以及启动和关闭的信息 默认命名hostname err 可以在参数文件中加上 log error file name 修改目录名和文件名 flush logs 命
  • Angular Tracy 小笔记 安装,目录结构介绍

    Angular 安装 目录结构介绍 Angular 4 0 安装 组件是 Angular 的核心思想 Angular 支持跨平台 手机 PC 都可以 是谷歌创建的 JS 框架 Single Page Application 单页应用 一些a
  • jmeter模拟不同ip并发请求

    Jmeter是 Apache 组织的开放源代码项目 它是功能和性能测试的工具 100 的用java实现 目前版本2 3 4 一直在用jmeter做压力测试 越来越觉得它功能强大 前段时间看有朋友说不能模拟不同ip进行并发测试 抽空研究了一下
  • Pixi.js 显示文字无法换行

    官方案例 message style wordWrap true wordWrapWidth 100 align center 中文无法换行 设置breakWords属性 sprite style wordWrap true wordWra
  • 03:一文全解:使用Tensorflow搭建卷积神经网络CNN识别手写数字图片

    标签 空格分隔 王小草Tensorflow笔记 笔记整理者 王小草 笔记整理时间 2017年2月25日 官方文档原文地址 https www tensorflow org get started mnist pros 官方文档最近更新时间