简单的神经网络提高精度的方法(学习心得)——MNIST手写数字集_向小黄追追追的博客-程序员秘密_如何提高神经网络的精度

初始的代码

//载入数据集
//one_hot 转化数据某一位是1 其他位为0
mnist =input_data.read_data_sets("D:\Python\MNIST_data",one_hot=True)

//每个批次的大小 以矩阵形式一次性放入200张到神经网络中去 
batch_size=200 
//计算一共有多少个批次=总量/批次 
n_batch=mnist.train.num_examples//batch_size

//定义两个placeholder
x=tf.placeholder(tf.float32,[None,784])#none和批次有关
y=tf.placeholder(tf.float32,[None,10])#y是标签

//创建一个简单的神经网络
//输入层784个神经元 输出层10个神经元
//权值,偏置值
W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([10]))
prediction=tf.nn.softmax(tf.matmul(x,W)+b)

//二次代价函数
loss=tf.reduce_mean(tf.square(y-prediction))
//梯度下降法
train_strp=tf.train.GradientDescentOptimizer(0.2).minimize(loss)

//初始化变量
init=tf.global_variables_initializer()

//求准确率的方法: 两个结果是预测与真实的值判断 结果存放在一个布尔型列表中 equal相同返回true 不同false
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
//argmax返回一维向量中最大的值所在的位置 也就是他的标签

//求准确率
//tf.cast(correct_prediction,tf.float32) 将布尔型转化为浮点型数据 true=1.0 false=0.0
//reduce_mean求平均值
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

//开始训练

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(30):#//把所有的图片训练30次
        for batch in range(n_batch)://把所有的图片循环了一次
            batch_xs,batch_ys=mnist.train.next_batch(batch_size)
            //图片数据保存在xs 图片标签保存在ys
            sess.run(train_strp,feed_dict={
    x:batch_xs,y:batch_ys})
        //执行accuracy这个方法 参数就是feed_dict里面的数据
        acc=sess.run(accuracy,feed_dict={
    x:mnist.test.images,y:mnist.test.labels})
        print('Iter'+str(epoch)+",Testing Accuracy"+str(acc))

不使用lstm和卷积神经网络的情况下提高识别准确率
1、批次的大小可以修改batch_size=200
2、可以增加隐藏层 激活函数、神经元都可尝试
3、将权值和偏置值初始化为0 或初始化方式 是否效果会好
4、代价函数 使用交叉熵
5、学习率
6、可以尝试更多的训练次数

交叉熵(可以加快模型收敛速度)

// 将二次代价函数换为交叉熵 对比结果 其他都没变化
//交叉熵并且求平均值
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))

看到交叉熵在迭代5个周期就到了90 而二次代价函数迭代了13个周期
所以交叉熵速度快很多 并且效果好 花费较少的时间达到同样的效果
在这里插入图片描述
== 使用优化器==

// 使用优化器
//train_step=tf.train.GradientDescentOptimizer(0.2).minimize(loss)
train_step=tf.train.AdamOptimizer(1e-2).minimize(loss)

在这里插入图片描述

交叉熵+优化器
很快就到了93 但是没有提高 说明不是这么样用的 再学习一下
在这里插入图片描述

// 增加了中间层 还是采用二次代价函数 
//定义神经网络中间层
W = tf.Variable(tf.zeros([784,100])) 
b = tf.Variable(tf.random_normal([100])) 
L1 = tf.nn.relu(tf.matmul(x,W) + b) 

//定义神经网络输出层
W_2 = tf.Variable(tf.random_normal([100,10])) 
b_2 = tf.Variable(tf.zeros([10])) 
prediction = tf.nn.softmax(tf.matmul(L1,W_2) + b_2) 

//二次代价函数
loss=tf.reduce_mean(tf.square(y-prediction))
//优化器
train_strp=tf.train.MomentumOptimizer(0.2,0.9).minimize(loss)

精度提高到96
在这里插入图片描述
其他的方法陆续学习 并 尝试

第一次更新:2019/3/2
第二次更新:2019/3/3

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37743098/article/details/88079127

智能推荐

Apache Tomcat Version 8.5.54 Release Notes_咔啡的博客-程序员秘密

================================================================================Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file...

Android 架构组件设计思想总结_feelang的博客-程序员秘密_android架构思想

原文地址:https://mp.weixin.qq.com/s/-2z7lAGQ3GeSqFfkPGPWNA转载已获授权Google 为帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成一个整体,叫作 Android Jetpack,其包含的组件如下图所示:旧 support 包也被整合进了 Jetpack,例如上图 Foundation 模块的 ...

iptables防火墙规则操作_peidongyao的博客-程序员秘密

一、查看防火墙规则iptables -L -n 或者iptables -nvl二、配置默认规则iptables -P INPUT DROP   不允许进iptables -P FORWARD DROP  不允许转发iptables -P OUTUPT ACCEPT  允许出三、增加规则iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT//允许源ip地址为19...

三分钟,让你弄清楚Python中函数的括号使用_lamehd的博客-程序员秘密_python 函數 括號

一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大困惑。执行结果:根据结果来分析:1、 x = aaa aaa是一个类名,后面没加括号,打印结果 ,表明x是个类2、 由于没有加括号,类没有实例化,y为公有属性,因此x.y打印的结果为you3、foo为aaa类中的函数,称为方法或属性,同时 foo后面也未加括号,打印...

下划线 动画_Just do it的博客-程序员秘密

<ul class="ddd"> <li class="solid active">啦啦啦啦</li> <li class="solid">我哦我我</li> <li class="solid">哦哦哦哦</li> <li class="solid">噢噢噢噢</li> ...

java设计模式之——策略模式_lvwenwenjava的博客-程序员秘密

java设计模式之——策略模式1,什么是策略模式?策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。2,策略模式有什么好处?     策略模式的好处在于你可以动态的改变对象的行为。3,设计原则       设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样...

随便推点

高中数学思维导图_正统之独孤求败的博客-程序员秘密

高中数学三年最全、最新、最清晰的思维导图 涵盖高中数学三年所有知识要点集合▼不等式▼函数▼三角函数▼解三角形▼数列▼空间向量与立体几何▼直线方程▼圆的方程▼圆锥曲线▼复数▼简单几何体▼二项式定理▼ 概率与统计...

Android listView的展开与收起实现折叠,及动态设置子ListView的高度_tsaopin的博客-程序员秘密_android listview折叠

问题重现最近在公司项目中做一个商品展示的功能,要求在分类后 ,对每个类进行展开、收起操作。想法就是在ListView中嵌套一个ListView,通过动态的显示和隐藏ListView,实现展开和收起操作在同一个页面,实现折叠效果。难点:解决ListView的动态设置问题.先看效果图: 解决思路外面一层是一个ListView,在填充Item的时候,在Item布局设置为LinearLayout,在下面设

Hbuilder 选择chorme打开网页时没有反应,_Young_Gao的博客-程序员秘密

我的hbuilder版本是     HBuilder 9.0.2.201803061935点击工具栏的运行,找到运行配置找到chorme   右边再选择 google chorme就可以了 2018-03-26 补充:还有一种情况,最开始你无法打开chrome,然后你按照提示自己设置了一个chrome的路径,最后发现点击chrome图标还是没有用,然后你后来重装...

Unicode 与 UTF-8_weixin_33725239的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准>>> ...

python实现蒙特卡洛模拟_随机模拟——蒙特卡洛算法及Python实现_weixin_39808143的博客-程序员秘密

随机模拟——蒙特卡洛算法及Python实现irony•2020 年 04 月 24 日蒙特卡洛算法介绍蒙特卡洛算法(Monte Carlo method)也称统计模拟算法,是一种以概率统计理论为指导的数值计算方法方法。是指使用随机数来解决很多计算问题的方法。蒙特卡洛方法基本思想通常蒙特卡洛算法可以分为两种:1,一种是所求解的问题本身具有内在随机性,借助计算机的运算能力可以直接模拟这种随机的过程...

推荐文章

热门文章

相关标签