Python利用全连接神经网络求解MNIST问题详解_python

来源:脚本之家  责任编辑:小易  

1、全连接神经网络解析:对n-1层和n层而言,n-1层的任意一百个节点,都和第n层所有节点有连接。即第n层的每个节点在进行计算的时候,激活函数的度输入是n-1层所有节点的加权。2、全连接的神经网络示意图:3、“全连接”是一种不错的模式,但是网络很大的时候,训练速度回很慢。部分连接就是认为的切断知某两个节点直接的连接,这样训练时计算量大大减小。神经网络1、一般的SGD的模型只有一层WX+b,现在需要道使用一个RELU作为中间的隐藏层,连接两个WX+b,仍然只需要修改Graph计算单元为:而为了在数学上满足矩阵运算,我们需要这样的回矩阵运算:这里N取1024,即1024个隐藏结点。2、于是四个参数被修改:其中,预测值计算方法改为:3、计算3000次,可以发现准确率一开始提高得很快答,后面提高速度变缓,最终测试准确率提高到88.8%www.zgxue.com防采集请勿采集本网。

本文实例讲述了Python利用全连接神经网络求解MNIST问题。分享给大家供大家参考,具体如下:

1、单隐藏层神经网络

如果你用的socket包里的那些阻塞接口,当然写个线程循环监测时间也没啥,只不过记得在循环内加上个sleep,哪怕是1ms甚至1us的sleep都考虑到以后可能有多设备,显然利用这些成型的玩意更合理。

人类的神经元在树突接受刺激信息后,经过细胞体处理,判断如果达到阈值,则将信息传递给下一个神经元或输出。类似地,神经元模型在输入层输入特征值x之后,与权重w相乘求和再加上b,经过激活函数判断后传递给下一层隐藏层或输出层。

连接网络的事情,就不要交给python了。出错的时候报个警。

单神经元的模型只有一个求和节点(如左下图所示)。全连接神经网络(Full Connected Networks)如右下图所示,中间层有多个神经元,并且每层的每个神经元都是与上一层和下一层的节点都对应连接。中间隐藏层只有一层的神经元网络称为单隐藏层神经网络。如果有多个中间隐藏层则称为多隐藏层神经网络。

PYQT(可以使用他的软件进行控件布局在转换成python代码),wxpython也简单,设计方法大同小异,简答网络程序(指爬虫?还是脚本上网等)爬虫的框架多,学习也简单,脚本也很简单,然后安卓可以使用(不

          

具体操作就是在原来的全连接的层前面加入了部分连接的卷积层与降维层,而且加入的是一个层级。输入层-卷积层-降维层-卷积层-降维层-.-隐藏层-输出层 简单来说,原来多层神经网络做的步骤是:特征映射到值

常见的激活函数如下所示:

随着越来越多的开发者开始关注人工智能,AI 巨头们纷纷选择了开源的道路:2015年9月Facebook开源了用于在Torch上更快速地训练神经网络的模块,11月Google开源 TensorFlow,2016年1月微软开源CNTK。

下面是在单个神经元逻辑回归求解MNIST手写数字识别问题的基础上,采用单隐藏层神经网络进行求解的过程。

首先载入数据,从Tensor FLow提供的数据库中导入MNIST数据

import tensorflow as tfimport tensorflow.examples.tutorials.mnist.input_data as input_datamnist=input_data.read_data_sets('MNIST_data/',one_hot=True)

构建输入层,其中x是图像的特征值,由于是28×28=784个像素点,所有输入为未知行数、每行784的二维数组。y是图像的标签值,共有0~9十种可能,所有为[None,10]的二维数组

x=tf.placeholder(tf.float32,[None,784],name='x')y=tf.placeholder(tf.float32,[None,10],name='y')

构建隐藏层,设置隐藏层神经元个数为256,由于输入层输入为784,而隐藏层神经元为h1_num,所以W1为[784,h1_num]形式的二维数组,b为[h1_num]的一维向量。此外采用ReLU作为激活函数处理输出。

h1_num=256 #设置隐藏层神经元数量W1=tf.Variable(tf.random_normal([784,h1_num]),name='W1')b1=tf.Variable(tf.zeros([h1_num]),name='b1')Y1=tf.nn.relu(tf.matmul(x,W1)+b1) #激活函数

构建输出层,由于隐藏层有h1_num个神经元输出,输出层输出10种输出结果,所以W2为[h1_num,10]的二维数组,b2为[10]的一维向量。最后结果通过softmax将线性输出Y2转化为独热编码方式。

W2=tf.Variable(tf.random_normal([h1_num,10]),name='W2')b2=tf.Variable(tf.zeros([10]),name='b2')Y2=tf.matmul(Y1,W2)+b2pred=tf.nn.softmax(Y2)

设置训练的超参数、损失函数、优化器,这里采用Adam Optimizer进行优化。准确率是通过比较预测值和标签值是否一致来定义。在定义损失函数时,如果直接使用交叉熵的方式定义,会出现log0值为NaN的情况,导致数据不稳定,无法得出结果。Tensor Flow提供了结合softmax定义交叉熵的方式softmax_cross_entropy_with_logits(),第一个参数为不经softmax处理的前向计算结果Y2,第二个参数为标签值y

train_epochs=20 #训练轮数batch_size=50 #每个批次的样本数batch_num=int(mnist.train.num_examples/batch_size) #一轮需要训练多少批learning_rate=0.01#定义损失函数、优化器loss_function=tf.reduce_mean( #softmax交叉熵损失函数 tf.nn.softmax_cross_entropy_with_logits(logits=Y2,labels=y)) optimizer=tf.train.AdamOptimizer(learning_rate).minimize(loss_function)#定义准确率correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

进行训练并输出损失值与准确率,训练进行多轮,每轮一开始分批次读入数据进行训练,每结束一轮输出一次损失和准确率。

ss=tf.Session()ss.run(tf.global_variables_initializer()) #进行全部变量的初始化 for epoch in range(train_epochs): for batch in range(batch_num): #分批次读取数据进行训练 xs,ys=mnist.train.next_batch(batch_size) ss.run(optimizer,feed_dict={x:xs,y:ys}) loss,acc=ss.run([loss_function,accuracy],\ feed_dict={x:mnist.validation.images,y:mnist.validation.labels}) print('第%2d轮训练:损失为:%9f,准确率:%.4f'%(epoch+1,loss,acc)) ss.close()

运行结果如下图,与单个神经元相比,可以较快得到较高的准确率

评估模型,将测试集数据填充入占位符x,y去求准确率,

test_res=ss.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})print('测试集的准确率为:%.4f'%(test_res))

2、多层神经网络

多层是指中间的隐藏层有多个,例如使用两层隐藏层,第一个隐藏层在计算后将结果输出到第二个隐藏层,再由第二个隐藏层计算后交给输出层,而第二个隐藏层的设置与第一个基本相同,例如:

#构建输入层x=tf.placeholder(tf.float32,[None,784],name='x')y=tf.placeholder(tf.float32,[None,10],name='y')#构建第一个隐藏层h1_num=256 #第一隐藏层神经元数量256W1=tf.Variable(tf.truncated_normal([784,h1_num],stddev=0.1),name='W1')b1=tf.Variable(tf.zeros([h1_num]),name='b1')Y1=tf.nn.relu(tf.matmul(x,W1)+b1)#构建第二个隐藏层h2_num=64 #第二隐藏层神经元数量64W2=tf.Variable(tf.random_normal([h1_num,h2_num],stddev=0.1),name='W2')b2=tf.Variable(tf.zeros([h2_num]),name='b2')Y2=tf.nn.relu(tf.matmul(Y1,W2)+b2)#构建输出层W3=tf.Variable(tf.random_normal([h2_num,10],stddev=0.1),name='W3')b3=tf.Variable(tf.zeros([10]),name='b3')Y3=tf.matmul(Y2,W3)+b3pred=tf.nn.softmax(Y3)

在第一隐藏层产生参数W1时采用的是截断正态分布的随机函数tf.truncated_normal(),与普通正太分布相比,截断正态分布生成的值之间的差距不会太大。

设置的第一隐藏层的神经元256个,第二层64个,因此第二层的每个输入有256个特征值,并产生64个输出,相应的W2的shape为[h1_num,h2_num],b2的shape为[h2_num]。输出层W3的shape为[h2_num,10]。函数的其他部分与单层神经网络相同。

经过运算多层的神经网络训练的准确率不一定比单层的高,因为还涉及到训练的超参数的设置等多种因素。但是多层神经网络的运行速度比单层慢,越多层的神经网络意味着更加复杂的计算量。

全连接层函数

通过以上多层神经网络的定义可以看出两个隐藏层与输出层的构建方法基本类似,都是定义对应的变量W、b,在定义W时其shape为[输出维度,输出维度],因此可以将隐藏层与输出层统一定义为一个全连接层函数:

#定义一个通用的全连接层函数模型def fcn_layer(inputs,in_dim,out_dim,activation=None): W=tf.Variable(tf.truncated_normal([in_dim,out_dim],stddev=0.1)) b=tf.Variable(tf.zeros([out_dim])) Y=tf.matmul(inputs,W)+b if activation==None: output=Y else: output=activation(Y) return output#构建第一个隐藏层Y1=fcn_layer(x,784,256,tf.nn.relu)#构建第二个隐藏层Y2=fcn_layer(Y1,256,64,tf.nn.relu)#构建输出层Y3=fcn_layer(Y2,64,10)pred=tf.nn.softmax(Y3)

其中inputs为本层的输入,in_dim为本层的输入维度,也就是上一层的输出维度,out_dim为本层的输出维度,activation为激活函数,默认为None。将输入与权重W叉乘再加上偏置值b得到Y,如果定义了激活函数,用激活函数处理Y,否则直接将Y赋给output输出。

3、模型的保存与读取

在模型训练结束后,如果希望下次继续使用或训练模型则需要将储存起来。

模型的储存

首先需要定义模型数据的保存路径:

import ossave_dir='D:/Temp/MachineLearning/ModelSaving/' #定义模型的保存路径if not os.path.exists(save_dir): #如果不存在该路径则创建 os.makedirs(save_dir)

定义储存粒度与saver,所谓储存粒度即每个几轮数据进行一次储存

save_step=5 #定义存储粒度 saver=tf.train.Saver() #定义saver

在每轮训练结束后进行判断,每隔5轮储存一次,储存路径中拼接轮数信息,

if epoch%save_step==0: saver.save(ss,os.path.join(save_dir,'mnist_fcn_{:02d}.ckpt'.format(epoch+1)))

在所有迭代训练执行结束后,再整体储存一次

saver.save(ss,os.path.join(save_dir,'mnist_fcn.ckpt'))

这样就会在指定目录下生成模型的保存文件:

模型的读取

从定义的模型目录中读取存盘点数据,并将其中的参数赋值给当前的session,然后便可以直接利用session进行测试,其准确率与保存时一致。

save_dir='D:/Temp/MachineLearning/ModelSaving/' #定义模型的保存路径saver=tf.train.Saver() #定义saver ss=tf.Session()ss.run(tf.global_variables_initializer()) ckpt=tf.train.get_checkpoint_state(save_dir) #读取存盘点if ckpt and ckpt.model_checkpoint_path: saver.restore(ss,ckpt.model_checkpoint_path) #从存盘中恢复参数到当前的session print('数据恢复从',ckpt.model_checkpoint_path) test_res=accuracy.eval(session=ss,feed_dict={x:mnist.test.images,y:mnist.test.labels})print('测试集的准确率为:%.4f'%(test_res))

在读取模型时有时候会遇到报错:

NotFoundError (see above for traceback): Restoring from checkpoint failed. This is most likely due to a Variable name or other graph key that is missing from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint.

这时只需重启kernel即可。

通过图来保存模型

也可以将训练好的模型以图的形式保存为.pb文件,下次直接可以使用,但不可以继续训练。

通过tf.train.write_graph函数来保存模型如下:

import tensorflow as tf v=tf.Variable(1.0,'new_var')with tf.Session() as ss: tf.train.write_graph(ss.graph_def,'D:\Temp\MachineLearning\ModelSaving\Graph', 'test_graph.pb',as_text=False)

读取图文件并还原:

with tf.Session() as ss: with tf.gfile.GFile('D:/Temp\MachineLearning/ModelSaving/Graph/test_graph.pb','rb') as pb_file: graph_def=tf.GraphDef() graph_def.ParseFromString(pb_file.read()) ss.graph.as_default() tf.import_graph_def(graph_def) print(graph_def)

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

神经网络模型的分类人工神经网络的模型很多,可以按照不同的方法进行分类。其中,常见的两种分类方法是,按照网络连接的拓朴结构分类和按照网络内部的信息流向分类。1 按照网络拓朴结构分类网络的拓朴结构,即神经元之间的连接方式。按此划分,可将神经网络结构分为两大类:层次型结构和互联型结构。层次型结构的神经网络将神经元按功能和顺序的不同分为输出层、中间层(隐层)、输出层。输出层各神经元负责接收来自外界的输入信息,并传给中间各隐层神经元;隐层是神经网络的内部信息处理层,负责信息变换。根据需要可设计为一层或多层;最后一个隐层将信息传递给输出层神经元经进一步处理后向外界输出信息处理结果。而互连型网络结构中,任意两个节点之间都可能存在连接路径,因此可以根据网络中节点的连接程度将互连型网络细分为三种情况:全互连型、局部互连型和稀疏连接型2 按照网络信息流向分类从神经网络内部信息传递方向来看,可以分为两种类型:前馈型网络和反馈型网络。单纯前馈网络的结构与分层网络结构相同,前馈是因网络信息处理的方向是从输入层到各隐层再到输出层逐层进行而得名的。前馈型网络中前一层的输出是下一层的输入,信息的处理具有逐层传递进行的方向性,一般不存在反馈环路。因此这类网络很容易串联起来建立多层前馈网络。反馈型网络的结构与单层全互连结构网络相同。在反馈型网络中的所有节点都具有信息处理功能,而且每个节点既可以从外界接受输入,同时又可以向外界输出内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 神经网络(bp)算法python实现及应用
  • python实现的三层bp神经网络算法示例
  • python编程实现的简单神经网络算法示例
  • python构建深度神经网络(dnn)
  • python与人工神经网络:使用神经网络识别手写图像介绍
  • tensorflow平台下python实现神经网络
  • python实现的递归神经网络简单示例
  • python利用逻辑回归模型解决mnist手写数字识别问题详解
  • 详解python实现识别手写mnist数字集的程序
  • python读取二进制mnist实例详解
  • python mnist手写识别数据调用api的方法
  • python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
  • python3.6数独问题的解决
  • python一键查找ios项目中未使用的图片、音频、视频资源
  • 异步任务队列celery在django中的使用方法
  • python模块之paramiko实例代码
  • python 比较2张图片的相似度的方法示例
  • python获取中文字符串长度的方法
  • python获取局域网占带宽最大3个ip的方法
  • python日志syslog使用原理详解
  • python3连接sqlserver、oracle、mysql的方法
  • python3.7黑帽编程之病毒篇(基础篇)
  • 神经网络连接方式分为哪几类?每一类有哪些特点
  • 什么是全连接神经网络,怎么理解“全连接”?
  • 谁能科普一下“深度学习”网络和以前那种“多层神经网络”的区别
  • python 适合做什么开发
  • 如何用Python实现实时的网络连接检测
  • python怎么自动连接网络
  • python和C#哪个适合我?
  • 深度学习和神经网络的区别是什么
  • 百度Paddle会和Python一样,成为最流行的深度学习引擎吗
  • 如何用python实现通过跳板机连接线上内部网络的Mysql服务器
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页pythonpython数据结构与算法教程python加密解密算法与技巧总结python编码操作技巧总结python函数使用技巧总结python字符串操作技巧汇总python入门与进阶经典教程神经网络(bp)算法python实现及应用python实现的三层bp神经网络算法示例python编程实现的简单神经网络算法示例python构建深度神经网络(dnn)python与人工神经网络:使用神经网络识别手写图像介绍tensorflow平台下python实现神经网络python实现的递归神经网络简单示例python利用逻辑回归模型解决mnist手写数字识别问题详解详解python实现识别手写mnist数字集的程序python读取二进制mnist实例详解python mnist手写识别数据调用api的方法python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】python3.6数独问题的解决python一键查找ios项目中未使用的图片、音频、视频资源异步任务队列celery在django中的使用方法python模块之paramiko实例代码python 比较2张图片的相似度的方法示例python获取中文字符串长度的方法python获取局域网占带宽最大3个ip的方法python日志syslog使用原理详解python3连接sqlserver、oracle、mysql的方法python3.7黑帽编程之病毒篇(基础篇)python入门教程 超详细1小时学会python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 使用心得(一)安装和首python strip()函数 介绍python 中文乱码问题深入分析python科学计算环境推荐——anacpython逐行读取文件内容的三种方python中使用xlrd、xlwt操作exce利用python将文本中的中英文分离方法python实现批量将word转html并将html内容python面向对象之类和对象属性的增删改查python:合并两个numpy矩阵的实现python 使用list和tuple+条件判断详解python中生成器和yield语句的用法详解python 字典中文key处理,读取,比较方法scrapy数据存储在mysql数据库的两种方式(python3 dict ndarray 存成json,并保留原详解python之数据序列化(json、pickle、
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved