首先,关于神经网络,其实是一个结合很多知识点的一个算法,关于cnn(卷积神经网络)大家需要了解:

          下面给出我之前总结的这两个知识点(基于吴恩达的机器学习)

          代价函数:

          代价函数
          代价函数(Cost Function )是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均

          具体的了解请看我的博客:

          https://blog.csdn.net/qq_40594554/article/details/97389489

          梯度下降:

          梯度下降一般讲解采用单变量梯度下降,但是一般在程序中常用多变量梯度下降

          单变量梯度下降大家可以了解最小二乘法,多变量梯度下降也是基于上述知识点演化而来,具体讲解可以看我的博客:

          https://blog.csdn.net/qq_40594554/article/details/97391667

    在这里,我们以上述知识点为基础,了解深度神经网络里面的卷积神经网络:

    大家可以看我这两篇了解神经网络相关知识点

    神经网络:https://blog.csdn.net/qq_40594554/article/details/97399935

    神经网络入门:https://blog.csdn.net/qq_40594554/article/details/97617154

    神经网络的一个大致流程如下:

    例如:我们有三个数据:x1,x2,x3,我们将其输入到我们的这个神经网络中,我们称L1为输入层,L2为隐藏层,L3为输出层

        我们用通俗的话来描述:即为我们的输入层L1输入3个数据,通过3个神经单元a1,a2,a3,其中x1,x2,x3在a1中占有不同的权值,x1,x2,x3在a2中又占有不同的权值,x1,x2,x3在a3中占有不同的权值

        通过代价函数求出最优解,即为最优权值,最后得出a1,a2,a3的值,然后a1,a2,a3再通过L3的这个神经单元,通过权值计算得出输出,这就是一个最简单的神经网络,如果不是很理解,大家可以看我上面的博客。

    下面我用tensorflow实现普通的神经网络:即为通过几层隐藏层来进行权值确定。

    上述中的相关神经元计算,类似于一个黒夹子,计算过程是不显示的我们最后知道的是结果,在传统神经网络计算中,一般计算的神经元是非常多的,所以传统神经网络无法满足,容易出现计算量大,但是准确率低的可能性,于是出现了卷积神经网络!

    

    

    上图中,我们需要计算的权值非常多,就需要大量的样本训练,我们模型的构建,需要根据数据的大小来建立,防止过拟合,以及欠拟合。

    因此,cnn算法通过感受野和权值共享减少了神经网络需要训练的参数个数,如图(大家可以百度了解这是什么意思):

    其实卷积神经网络很容易理解:

      他的最简单相关步骤为:积卷层-池化层-积卷层-池化层-....-全连接层

      卷积层:数据通过卷积核,按照卷积核的步长,一步一步扫描,得出一个新的特征图

      池化层:通过卷积核扫描后得出的特征图,进行池化,实际上池化层也是加强特征图的一个手段

    卷积层(建议大家可以百度卷积核是什么):  

    

    池化层(常用的有最大值池化,平均池化):

    实际上通过上述手段主要是来获取和增强特征

    至于全连接层,即为通过池化后的结果,通过激励函数后,排除不需要的特征图,然后输出:

    我这里给出一个关于手写数字识别的源码:

    

import  tensorflow as tf#9.50
from tensorflow.examples.tutorials.mnist import input_data
#载入数据集
mnist=input_data.read_data_sets("MNNIST_data",one_hot=True)#下载网上的数据集
#print(mnist)
#每个批次的大小,每次放入100张图片放入神经网络训练。
batch_size=100
#计算一共有多少批次
n_bach=mnist.train.num_examples//batch_size#//整除
#初始化权值
def weight_variable(shape):
inital=tf.truncated_normal(shape,stddev=0.1)
return tf.Variable(inital)
#初始化偏置值
def bias_variable(shape):
initial=tf.constant(0.1,shape=shape)
return tf.Variable(initial)
#卷积层
def conv2d(x,W):
return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
#使用了这个库,tf.nn.conv2d
#池化层
def max_pool_2(x):
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
#定义两个placeholder
x=tf.placeholder(tf.float32,[None,784])#784列
y=tf.placeholder(tf.float32,[None,10])#0-9,10个数字
#改变x的格式转为4d向量[batch,in_height,in_width,in_channels]
x_image=tf.reshape(x,[-1,28,28,1]) #初始化第一个卷积层的权值和偏置值
W_conv1=weight_variable([5,5,1,32])#采用5*5的采样窗口,32个卷积核从1个平面抽取特征
b_conv1=bias_variable([32])#每个卷积核一个偏置值
#把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
h_pool1=max_pool_2(h_conv1)#进行max-pooling #初始化第二个卷积层的权值和偏置值
W_conv2=weight_variable([5,5,32,64])#采用5*5的采样窗口,32个卷积核从1个平面抽取特征
b_conv2=bias_variable([64])#每个卷积核一个偏置值
#把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
h_pool2=max_pool_2(h_conv2)#进行max-pooling #初始化第一个全连接的权值
W_fcl=weight_variable([7*7*64,1024])#上一场有7*7*64个神经元,全连接层有1024个神经元
b_fcl=bias_variable([1024])#1024个节点
#把池化层2的输出扁平化维一维
h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
#求第一个全连接的输出
h_fcl=tf.nn.relu(tf.matmul(h_pool2_flat,W_fcl)+b_fcl)
#keep_prob表示神经元的输出概率
keep_prob=tf.placeholder(tf.float32)
h_fcl_drop=tf.nn.dropout(h_fcl,keep_prob) #初始化第二个全连接层
W_fc2=weight_variable([1024,10])
b_fc2=bias_variable([10])
#计算输出
prediction=tf.nn.softmax(tf.matmul(h_fcl_drop,W_fc2)+b_fc2)
#交叉熵代价函数
cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
#使用Adamoptimizer进行优化
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
#结果存放在一个布尔列表中
correct_prediction=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))#argmax返回一维张量中最大值所在位置
#求准确率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
with tf.Session()as sess:
sess.run(tf.global_variables_initializer())
#把所有图片训练21次
for epoch in range(21):
# 执行一次,即为把训练集的所有图片循环一次
for batch in range(n_bach):
#获取100张图片,图片数据保存在_xs,标签保存在ys
batch_xs,batchys=mnist.train.next_batch(batch_size)
sess.run(train_step,feed_dict={x:batch_xs,y:batchys,keep_prob:0.7})
#传进测试集,数据集的数据
acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
print("第"+str(epoch)+"准确率:"+str(acc))

    很容易第一次就可以得出很高的准确率:

    希望大家能够看懂cnn算法的流程(讲的比较多,当然CNN算法不可能一篇文章就学会了,我这里仅仅给大家讲了CNN算法的一个流程)。我之前的相关博文也在上面,可能对大家的理解有帮助,大家可以查看。

个人水平有限,目前还不能实现手写CNN算法以及数学公式,后面会继续学习,当然,对于机器学习,神经网络推荐大家先从视频学习开始,例如:吴恩达的机器学习。

最后希望大家学有所成!

  

  

    

python-积卷神经网络全面理解-tensorflow实现手写数字识别的更多相关文章

  1. 利用神经网络算法的C#手写数字识别

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwritten_character_recognition.zip 下载源码 - 70. ...

  2. OpenCV+TensorFlow图片手写数字识别(附源码)

    初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...

  3. 利用神经网络算法的C#手写数字识别(一)

    利用神经网络算法的C#手写数字识别 转发来自云加社区,用于学习机器学习与神经网络 欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwri ...

  4. TensorFlow 之 手写数字识别MNIST

    官方文档: MNIST For ML Beginners - https://www.tensorflow.org/get_started/mnist/beginners Deep MNIST for ...

  5. 利用神经网络算法的C#手写数字识别(二)

    利用神经网络算法的C#手写数字识别(二)   本篇主要内容: 让项目编译通过,并能打开图片进行识别.   1. 从上一篇<利用神经网络算法的C#手写数字识别>中的源码地址下载源码与资源, ...

  6. Tensorflow实战 手写数字识别(Tensorboard可视化)

    一.前言 为了更好的理解Neural Network,本文使用Tensorflow实现一个最简单的神经网络,然后使用MNIST数据集进行测试.同时使用Tensorboard对训练过程进行可视化,算是打 ...

  7. TensorFlow——MNIST手写数字识别

    MNIST手写数字识别 MNIST数据集介绍和下载:http://yann.lecun.com/exdb/mnist/   一.数据集介绍: MNIST是一个入门级的计算机视觉数据集 下载下来的数据集 ...

  8. 【转】机器学习教程 十四-利用tensorflow做手写数字识别

    模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基 ...

  9. 100天搞定机器学习|day39 Tensorflow Keras手写数字识别

    提示:建议先看day36-38的内容 TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edge ...

随机推荐

  1. 跟着大彬读源码 - Redis 8 - 对象编码之字典

    目录 1 字典的实现 2 插入算法 3 rehash 与 渐进式 rehash 总结 字典,是一种用于保存键值对的抽象数据结构.由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字 ...

  2. LeetCode :2.两数相加 解题报告及算法优化思路

    题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...

  3. 【Kubernetes 系列二】从虚拟机讲到 Kubernetes 架构

    目录 什么是虚拟机? 什么是容器? Docker Kubernetes 架构 Kubernetes 对象 基础设施抽象 在认识 Kubernetes 之前,我们需了解下容器,在了解容器之前,我们得先知 ...

  4. Spark1——介绍

    1.Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台. 2.Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件.首先Spark的核心是一个对由很多计算任务组成的. ...

  5. Java并发编程实战笔记—— 并发编程3

    1.实例封闭 class personset{ private final Set<Person> myset = new HashSet<Person>(); public ...

  6. python之闭包+装饰器

    闭包 内部函数对外部函数作用域变量的引用. 函数内的属性都是有生命周期的,都是在函数执行期间 闭包内的闭包函数私有化了变量,类似于面向对象 图片解析 示例一 https://www.bilibili. ...

  7. Gin + Vue全栈开发实战(二)

    尝试地写了第一篇自己学习Go Web框架的感受和入门的文章,发现反响还不错,大家也提出了很多的问题来一起交流.近期也渐渐地出现了很多有关go语言开发的相关文章,包括有在蚂蚁金服的大牛的分享,我也一直有 ...

  8. 入门MySQL——DML语句篇

    前言:  在上篇文章中,主要为大家介绍的是DDL语句的用法,可能细心的同学已经发现了.本篇文章将主要聚焦于DML语句,为大家讲解表数据相关操作. 这里说明下DDL与DML语句的分类,可能有的同学还不太 ...

  9. CEF避坑指南(一)——下载并编译第一个示例

    CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司,如网易.腾讯都开始使用CEF进行前端开 ...

  10. CF553C Love Triangles(二分图)

    Tyher推的好题. 题意就是给你一些好边一些坏边,其他边随意,让你求符合好坏坏~,或者只包含好好好的三元环的无向图个数. 坏坏的Tyher的题意是这样的. 再翻译得更加透彻一点就是:给你一些0(好边 ...