一:传统神经网络存在的问题

  • 权值太多,计算量太大
  • 权值太多,需要大量样本进行训练

二:卷积神经网络(CNN)

CNN通过感受野和权值共享减少了神经网络需要训练的参数个数。

三:池化

四:卷积操作

五:CNN结构

六:基于卷积神经网络的手写数字识别

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data # 载入数据集
mnist=input_data.read_data_sets('MNIST_data',one_hot=True)
# 每个批次的大小
batch_size=100
# 计算一共有多少个批次
n_batch=mnist.train.num_examples//batch_size # 初始化权值
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) # 卷积层
def conv2d(x,W):
# x input tensor of shape (batch,in_height,in_width,in_channels)
# W 相当于滤波器,卷积盒
# W filter/kernel tensot of shape [filter_height,filter_width,in_channels,out_channels]
# strides[0]=strides[3]=1;strides[1]代表x方向的步长,strides[2]代表y方向的步长
# padding:A string from:'SAME','VALID'
return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME') # 二维的卷积操作 # 池化层
def max_pool_2x2(x):
# ksize[1,x,y,1]
# ksize表示窗口大小
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]) # 28*28
y=tf.placeholder(tf.float32,[None,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_2x2(h_conv1) # 进行max-pooling # 初始化第二个卷积层的权值和偏置
W_conv2=weight_variable([5,5,32,64])# 5*5的采样窗口,64个卷积核从32个平面抽取特征
b_conv2=bias_variable([64]) # 每一个卷积核一个偏置值 # 把h_pool1和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
h_pool2=max_pool_2x2(h_conv2) # 进行max-pooling # 28*28的图片第一次卷积后还是28*28,第一次池化后变为14*14
# 第二次卷积后为14*14,第二次池化后变为7*7
# 经过上面操作后得到64张7*7的平面 # 初始化第一个全连接层的权值
W_fc1=weight_variable([7*7*64,1024]) # 上一场有7*7*64个神经元,全连接层有1024个神经元
b_fc1=bias_variable([1024]) # 1024个节点 # 吧池化层2的输出扁平化为1维
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) # keep_prob用来表示神经元的输出概率
keep_prob=tf.placeholder(tf.float32)
h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob) # 初始化第二个全连接层
W_fc2=weight_variable([1024,10])
b_fc2=bias_variable([10]) # 计算输出
prediction=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2) # 交叉熵代价函数
cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(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())
for epoch in range(21):
for batch in range(n_batch):
batch_xs,batch_ys=mnist.train.next_batch(batch_size)
sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7}) # 70%的神经元在工作 acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
print('Iter:'+str(epoch)+',Testing Sccuracy:'+str(acc))

运行结果:

Iter:0,Testing Sccuracy:0.8583
Iter:1,Testing Sccuracy:0.9681
Iter:2,Testing Sccuracy:0.9756
Iter:3,Testing Sccuracy:0.9803
Iter:4,Testing Sccuracy:0.9827
Iter:5,Testing Sccuracy:0.983
Iter:6,Testing Sccuracy:0.9861
Iter:7,Testing Sccuracy:0.9864
Iter:8,Testing Sccuracy:0.9876
Iter:9,Testing Sccuracy:0.9883
Iter:10,Testing Sccuracy:0.9884
Iter:11,Testing Sccuracy:0.9902
Iter:12,Testing Sccuracy:0.9905
Iter:13,Testing Sccuracy:0.9897
Iter:14,Testing Sccuracy:0.9905
Iter:15,Testing Sccuracy:0.9903
Iter:16,Testing Sccuracy:0.9905
Iter:17,Testing Sccuracy:0.9912
Iter:18,Testing Sccuracy:0.9912
Iter:19,Testing Sccuracy:0.9916
Iter:20,Testing Sccuracy:0.9902 从上面可以看出准确率可以达到99%

TensorFlow(九):卷积神经网络的更多相关文章

  1. 使用TensorFlow的卷积神经网络识别自己的单个手写数字,填坑总结

    折腾了几天,爬了大大小小若干的坑,特记录如下.代码在最后面. 环境: Python3.6.4 + TensorFlow 1.5.1 + Win7 64位 + I5 3570 CPU 方法: 先用MNI ...

  2. TensorFlow实现卷积神经网络

    1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...

  3. tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图

    tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图 因为很多 demo 都比较复杂,专门抽出这两个函数,写的 demo. 更多教程:http://www.tensorflown ...

  4. TensorFlow构建卷积神经网络/模型保存与加载/正则化

    TensorFlow 官方文档:https://www.tensorflow.org/api_guides/python/math_ops # Arithmetic Operators import ...

  5. Tensorflow之卷积神经网络(CNN)

    前馈神经网络的弊端 前一篇文章介绍过MNIST,是采用的前馈神经网络的结构,这种结构有一个很大的弊端,就是提供的样本必须面面俱到,否则就容易出现预测失败.如下图: 同样是在一个图片中找圆形,如果左边为 ...

  6. 跟我学算法-tensorflow 实现卷积神经网络

    我们采用的卷积神经网络是两层卷积层,两层池化层和两层全连接层 我们使用的数据是mnist数据,数据训练集的数据是50000*28*28*1 因为是黑白照片,所以通道数是1 第一次卷积采用64个filt ...

  7. 字符型图片验证码,使用tensorflow实现卷积神经网络,进行验证码识别CNN

    本项目使用卷积神经网络识别字符型图片验证码,其基于 TensorFlow 框架.它封装了非常通用的校验.训练.验证.识别和调用 API,极大地减低了识别字符型验证码花费的时间和精力. 项目地址: ht ...

  8. Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...

  9. Python之TensorFlow的卷积神经网络-5

    一.卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度 ...

  10. TensorFlow——CNN卷积神经网络处理Mnist数据集

    CNN卷积神经网络处理Mnist数据集 CNN模型结构: 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积 ...

随机推荐

  1. AS3动画效果常用公式

    缓动公式: sprite.x += (targetX – sprite.x) * easing;//easing为缓动系数变量 sprite.y += (targetY – sprite.y) * e ...

  2. C# 简单的区块链实现

    1.项目配置 首先新建一个 Asp.Net Core 项目,然后选择 Empty Project(空项目) 类型,建立完成后无需进行任何配置. 2.数据模型 这里我们来创建一个具体的区块数据模型,使用 ...

  3. Go 关于 kafka 的生产者、消费者实例

    zookeeper + kafka 首先要在 apche 官网下载 kafka 的程序包(linux版本),然后放到服务器上解压,得到以下目录 bin 目录下包含了服务的启动脚本 启动 zookeep ...

  4. MySQL 数据库的安装与卸载

    一.安装 (1)打开下载的 mysql 安装文件双击解压缩,运行“mysql-5.5.40-win32.msi” (2)选择安装类型, 有“Typical(默认) ”. “Complete(完全) ” ...

  5. fatfs源码阅读

    使用fatfs文件的第一步,就是调用F_mount函数注册一个工作空间. F_mount函数的原型如下: 第一个参数根据网上大神的答复,是外设类型,如果是sd卡就是0,flash等等其他的外设就是其他 ...

  6. 【Mybatis】 入门

    一.概述 1.1 JDBC 1.2 JDBC编程中问题 1.3 MyBatis介绍 1.4 Mybatis架构 二.MyBatis入门程序 2.1 需求 2.2 引入MyBatis依赖 2.3 配置 ...

  7. 重构drf后的环境变量配置

    目录 环境变量 配置media 封装logger 封装项目异常处理 二次封装Response模块 环境变量 dev.py # 环境变量操作:小luffyapiBASE_DIR与apps文件夹都要添加到 ...

  8. C语言二级指针底层实现

    C语言中,Pointers to Pointers,即二级指针. 一级指针和二级指针的值都是指向一个内存单元: 一级指针指向的内存单元存放的是源变量的值, 二级指针指向的内存单元存放的是一级指针的地址 ...

  9. 《构建之法》第五次作业——Alpha项目测试

    博客开头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign?page=6 这个作业要求在 ...

  10. Python3 acm基础输入输出

    案例一:输入字符串分割并转化成多个int数值 a, b= map(int, input().split()) try: while True: a, b= map(int, input().split ...