1.卷积神经网络由输入层,卷积层,激活函数,池化层,全连接层组成.

input(输入层)--conv(卷积层)--relu(激活函数)--pool(池化层)--fc(全连接层)

2.卷积层:

主要用来进行特征的提取

卷积操作是使用一个二维的卷积核在一个批处理的图片上进行不断扫描。具体操作是将一个卷积核在每张图片上按照一个合适的尺寸在每个通道上面进行扫描。

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
这个函数的作用是对一个四维的输入数据 input 和四维的卷积核 filter 进行操作,然后对输入数据进行一个二维的卷积操作,最后得到卷积之后的结果。

tf.nn.bias_add(value, bias, name = None):这个函数的作用是将偏差项 bias 加到 value 上面。

3.激活函数

在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。

在神经网络中,我们有很多的非线性函数来作为激活函数,比如连续的平滑非线性函数(sigmoid,tanh和softplus),连续但不平滑的非线性函数(relu,relu6和relu_x)和随机正则化函数(dropout)。

所有的激活函数都是单独应用在每个元素上面的,并且输出张量的维度和输入张量的维度一样。

常用的激活函数:

(1)tf.nn.relu(features, name = None):这个函数的作用是计算激活函数relu,即max(features, 0)

(2)tf.nn.relu6(features, name = None):这个函数的作用是计算激活函数relu6,即min(max(features, 0), 6)

(3)tf.nn.softplus(features, name = None):这个函数的作用是计算激活函数softplus,即log( exp( features ) + 1)。

(4)tf.sigmoid(x, name = None):这个函数的作用是计算 x 的 sigmoid 函数。具体计算公式为 y = 1 / (1 + exp(-x))。

(5)tf.tanh(x, name = None):这个函数的作用是计算 x 的 tanh 函数。具体计算公式为 ( exp(x) - exp(-x) ) / ( exp(x) + exp(-x) )。

激活函数应该具有的特征:

(1)非线性。线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。。
(2)连续可微。梯度下降法的要求。
(3)范围最好不饱和,当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。
(4)单调性,当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。
(5)在原点处近似线性,这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。

4.池化层

主要是对输入的特征图进行压缩,一方面使特征图变小,简化网络计算负责度,另一方面进行特征压缩,提取主要特征。

迟化操作一般有两种:Avy Pooling和max Pooling

max Pooling:计算迟化区域中元素的最大值

5.Dropout 防止过拟合

当训练数据量比较小时,可能会出现因为追求最小差值导致训练出来的模型极度符合训练集,但是缺乏普适性,不能表达训练数据之外的数据

解决方案:

tf.nn.dropout(x, keep_prob, noise_shape = None, seed = None, name = None)

Dropout就是在不同的训练过程中随机扔掉一部分神经元也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。如下图:

 6.全连接层

连接所有的特征,将输出值送给分类器

7.总体的结构

8.CNN代码实现预测手写数字

 import warnings
warnings.filterwarnings('ignore')
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data # 加载数据,one-hot形式
mnist = input_data.read_data_sets('./',one_hot=True) # 卷积方法
def conv(input_data,filter_,b):
return tf.nn.conv2d(input_data,filter_,[1,1,1,1],'SAME') + b
# 池化:降维
def pool(input_data):
return tf.nn.max_pool(input_data,[1,2,2,1],[1,2,2,1],'SAME')
# 变量
def gen_v(shape):
return tf.Variable(initial_value=tf.random_normal(shape = shape,dtype = tf.float64)) # 第一层卷积
X = tf.placeholder(shape = [None,784],dtype=tf.float64)
y = tf.placeholder(shape = [None,10],dtype=tf.float64)
input_data = tf.reshape(X,shape = [-1,28,28,1])
filter1 = gen_v([3,3,1,32])
b1 = gen_v([32])
conv1 = tf.nn.relu(conv(input_data,filter1,b1))
pool1 = pool(conv1)
# pool1 shape=(?, 14, 14, 32) # 第二层卷积
filter2 = gen_v([3,3,32,64])
b2 = gen_v([64])
conv2 = tf.nn.relu(conv(pool1,filter2,b2))
pool2 = pool(conv2)
# pool2 shape=(?, 7, 7, 64) # 第三层卷积
filter3 = gen_v([3,3,64,64])
b3 = gen_v([64])
conv3 = tf.nn.relu(conv(pool2,filter3,b3))
pool3 = pool(conv3)
# pool3 shape=(?, 4, 4, 64) # 全连接层1024个神经元,输出1024个神经元
fc = tf.reshape(pool3,shape = [-1,4*4*64])
fc_w = gen_v([4*4*64,1024])
fc_b = gen_v([1024])
conn = tf.nn.relu(tf.matmul(fc,fc_w) + fc_b)
# conn shape=(?, 1024) # 防止过拟合dropout
rate = tf.placeholder(dtype=tf.float64)
dp = tf.nn.dropout(conn,rate =rate) # 输出层,其实就是全连接层
out_w = gen_v([1024,10])
out_b = gen_v([10])
out = tf.matmul(dp,out_w) + out_b
# out shape=(?,10)
y_ = tf.nn.softmax(out) # 构建损失函数
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y,logits = out)) # 优化梯度下降
opt = tf.train.AdamOptimizer(0.001).minimize(loss) # 训练
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) for i in range(10):
for j in range(100):
X_train,y_train = mnist.train.next_batch(550)
opt_,loss_ = sess.run([opt,loss],feed_dict = {X:X_train,y:y_train,rate:0.5})
print('里层循环执行次数:%d。损失是:%0.4f'%(j+1,loss_))
# 计算准确率
X_validation ,y_validation = mnist.validation.next_batch(2000)
y_pred = sess.run(y_,feed_dict = {X:X_validation,rate:0})
accuracy = (np.argmax(y_pred,axis = -1) == np.argmax(y_validation,axis = -1)).mean()
print('--------------------循环执行%d。准确率是%0.4f-------------------'%(i+1,accuracy))
saver.save(sess,'./model/three_cnn')

CNN预测手写数字

CNN卷积神经网络的构建的更多相关文章

  1. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

  2. cnn(卷积神经网络)比较系统的讲解

    本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之 ...

  3. Keras(四)CNN 卷积神经网络 RNN 循环神经网络 原理及实例

    CNN 卷积神经网络 卷积 池化 https://www.cnblogs.com/peng8098/p/nlp_16.html 中有介绍 以数据集MNIST构建一个卷积神经网路 from keras. ...

  4. [转]Theano下用CNN(卷积神经网络)做车牌中文字符OCR

    Theano下用CNN(卷积神经网络)做车牌中文字符OCR 原文地址:http://m.blog.csdn.net/article/details?id=50989742 之前时间一直在看 Micha ...

  5. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现(转)

    Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文, ...

  6. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?

    https://www.zhihu.com/question/34681168 CNN(卷积神经网络).RNN(循环神经网络).DNN(深度神经网络)的内部网络结构有什么区别?修改 CNN(卷积神经网 ...

  7. CNN(卷积神经网络)、RNN(循环神经网络)、DNN,LSTM

    http://cs231n.github.io/neural-networks-1 https://arxiv.org/pdf/1603.07285.pdf https://adeshpande3.g ...

  8. day-16 CNN卷积神经网络算法之Max pooling池化操作学习

    利用CNN卷积神经网络进行训练时,进行完卷积运算,还需要接着进行Max pooling池化操作,目的是在尽量不丢失图像特征前期下,对图像进行downsampling. 首先看下max pooling的 ...

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

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

随机推荐

  1. C语言程序设计100例之(4):水仙花数

    例4    水仙花数 题目描述 一个三位整数(100-999),若各位数的立方和等于该数自身,则称其为“水仙花数”(如:153=13+53+33),找出所有的这种数. 输入格式 没有输入 输出格式 若 ...

  2. PHP路径指定web路径的方法

    PHP路径指定web路径的方法直接在/前面加.就是代表web路径了 不是按照文件路径来算了 <pre>./Public/uploads/suolutu/' . $suijishu . '_ ...

  3. RHEL7-Vsftpd匿名用户

    实现:匿名用户创建目录,可以上传.下载文件,但是不可删除文件,禁止本地用户登陆. Vsftpd.conf部分参数 第一步:虚拟机挂载镜像 略 第二步:执行挂载命令 略 第三步:编写yum仓库文件 略 ...

  4. jsoup爬虫实战心得

    1.heder很重要,一切尽在header中.尤其cookie,useragent. 2.对于加密的连接,查看js加密过程并试着通过java或你正在使用的语言去实现 3.查看在跳转之前前端发起的关键请 ...

  5. 微信小程序(mpvue) wx.openSetting 无法调起设置页面

    在开发过程有个需要保存图片/视频到设备相册的业务,so easy~   巴啦啦撸下来了完整功能, wx.saveVideoToPhotosAlbum 会自动调起用户授权,美滋滋~~   btu.... ...

  6. hadoop伪分布式

    一.安装jdk 1.下载解压 2.配置环境变量 配置成功: 二.ssh免密码登录 https://www.cnblogs.com/suwy/p/9326087.html 三.hadoop伪分布式配置 ...

  7. mysql 创建用户及授权(2)

    一. MySQL初始密码 新安装的MySQL默认是没有密码的,设置初始密码可以用以下命 mysqladmin -u root password 'new-password' mysqladmin -u ...

  8. lqb 基础练习 闰年判断

    基础练习 闰年判断 时间限制:1.0s   内存限制:256.0MB     问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍 ...

  9. 【algo&ds】7.最短路径问题

    单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径 (有向)无权图:BFS (有向)有权图:Dijkstra算法 多源最短路径问题:求任意两顶点间的最短路径 直接将单源最短路算法调用|V ...

  10. 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码

    WiFi密码Python暴力破解   Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ...