这次扔使用上次的mnist数据集分类的简单版本程序,使用不同的代价函数做计算

二次代价函数

激活函数

使用二次代价函数的运行结果

#  使用二次代价函数的结果-精度
# loss=tf.reduce_mean(tf.square(y-prediction))
# 0.8322
# 0.8698
# 0.8818
# 0.8882
# 0.8935
# 0.8965
# 0.8999
# 0.9017
# 0.9039
# 0.9054
# 0.9062
# 0.9074
# 0.9081
# 0.9095
# 0.9099
# 0.91
# 0.9108
# 0.9125
# 0.9132
# 0.9132
# 0.9136
  • 问题所在:

  • 需求情况:
     距离目标越近,调整越慢,越远则调整越快

交叉熵代价函数

  • 这个怎么来的?

    因为sigmoid函数的公式:

    计算得到(自己求导试试)

信息熵的文章
熵其实是信息量的期望值,它是一个随机变量的确定性的度量。熵越大,变量的取值越不确定,反之就越确定。

–>与二次代价函数相比的优势所在。
越接近迈越小的步子

  • S形函数
     比如:sigmoid函数

  • 优势
     调整的比较合理,速度快

使用交叉熵的结果

# # 交叉熵代价函数
# loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
# 0.8334
# 0.895
# 0.9024
# 0.9057
# 0.9091
# 0.9108
# 0.912
# 0.913
# 0.9159
# 0.9162
# 0.9169
# 0.9191
# 0.9183
# 0.9203
# 0.9197
# 0.9201
# 0.9204
# 0.9206
# 0.9218
# 0.9215
# 0.9218

对数似然代价函数

似然最大估计


拟合

  • 回归

  • 欠拟合

  • 正确拟合

  • 过拟合:(未知数过多而已有的公式过少)

  • 分类

防止过拟合

n是训练集的大小,λ是一个参数可以调节正则项的重要性,w是权值,C是误差

  • dropout:
    如果一个神经元的参数几乎都等于0的话,那么多少乘以0都还是0,所以可以认为这个神经元不存在,将之删除。
    这样可以简化神经网络的
    在执行过程中,可以只让部分神经元工作,而另一部分不工作,如右图所示。实线神经元为工作的神经元,虚线则为不工作的神经元

demo2dropout

  • 加一个中间层

  • 初始化为0,并不是好的初始化方式,一般使用随机数初始化。

      # 加一个中间层keep_prob=tf.placeholder(tf.float32)# 创建一个简单的神经网络,直接784投影到10上W1=tf.Variable(tf.truncated_normal([784,2000],stddev=0.1))#  tf.truncated_normal(shape, mean, stddev) :shape表示生成张量的维度,mean是均值,stddev是标准差.正态分布b1=tf.Variable(tf.zeros([2000])+0.1)L1=tf.nn.tanh(tf.matmul(x,W1)+b1)L1_drop=tf.nn.dropout(L1,keep_prob)W2=tf.Variable(tf.truncated_normal([2000,2000],stddev=0.1))#  tf.truncated_normal(shape, mean, stddev) :shape表示生成张量的维度,mean是均值,stddev是标准差.正态分布b2=tf.Variable(tf.zeros([2000])+0.1)L2=tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)L2_drop=tf.nn.dropout(L2,keep_prob)#实际上用不着这么多层,这么多个神经元,这里是故意整这么多的,会出现过拟合情况(未知数过多而已有的公式过少)W3=tf.Variable(tf.truncated_normal([2000,1000],stddev=0.1))#  tf.truncated_normal(shape, mean, stddev) :shape表示生成张量的维度,mean是均值,stddev是标准差.正态分布b3=tf.Variable(tf.zeros([1000])+0.1)L3=tf.nn.tanh(tf.matmul(L2_drop,W3)+b3)L3_drop=tf.nn.dropout(L3,keep_prob)# keep_prob-->设置他有多少个神经元是工作的:0-1.1:100%工作。0.5:一半是在工作的W4=tf.Variable(tf.truncated_normal([1000,10],stddev=0.1))b4=tf.Variable(tf.zeros([10]))#b的形状依据每个批次的形状而定,在中间层时,每个批次未必是一行n列,也可能变换成多行多列,此时b随之改变。prediction=tf.nn.softmax(tf.matmul(L3_drop,W4)+b4)#(形状(100,10)
    

不使用dropout

sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})
100%的神经元都工作的情况下

使用dropout

70%神经元工作情况下的训练结果
测试时仍有100%在工作,收敛速度很快,但后来上不去了,而且测试精度与训练精度相差很大

 sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7})print("test-iter:",epoch," acc:",sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0}))
print("train-iter:",epoch," acc:",sess.run(accuracy, feed_dict={x: mnist.train.images, y: mnist.train.labels, keep_prob: 1.0}))

收敛速度变慢了,但三十次所达到的还不是极限,这个精度还能上升,并且,测试精度和训练精度相差不大

优化器Optimizer

训练时间:标准>批量>随机
噪音:标准<批量<随机
批量用的多

W:要训练的参数
J(W):代价函数

对W的梯度






gt同上,是梯度。

效果

星:全局最小
速度:adadelta最快,SGD最慢。momentum很快,但是路径绕,NAG相当于聪明版本的momentum

鞍顶问题

除了adaelta和adagrad外,都在窝里来回晃悠。后来除了SGD以外的才晃悠出来,如下

  • SGD:慢,而且鞍顶也无法逃离,那是不是不用了?
    每种优化器都有其适用范围,新的都快,但是SGD准确率高。

不知道哪个优化器最后的结果准确率最高,这个说不准,可能都要测试一次

优化器的比较:
https://blog.csdn.net/fengchao03/article/details/78208414
https://blog.csdn.net/weixin_40170902/article/details/80092628
https://www.jianshu.com/p/ee39eca29117

优化demo1

  1. 加中间层(中间层的层数、神经元数太多的话可以降低
  2. keep_drop改成0.7之类的试试
  3. 权值从0变成tf.truncated_normal([2000,1000],stddev=0.1),b变成0.1
  4. 优化器的选择,调节学习率
  5. 中间层的激活函数,tanh或者其他什么delu,softmax啊之类的
  6. 迭代次数要足够,趋于稳定

tensorflow4 代价函数、dropout、优化器相关推荐

  1. 机器学习:各种优化器Optimizer的总结与比较

    优化器总结 机器学习中,有很多优化方法来试图寻找模型的最优解.比如神经网络中可以采取最基本的梯度下降法. 梯度下降法(Gradient Descent) 梯度下降法是最基本的一类优化器,目前主要分为三 ...

  2. TensorFlow学习(四):优化器Optimizer

    梯度下降优化算法综述    该文翻译自An overview of gradient descent optimization algorithms.    总所周知,梯度下降算法是机器学习中使用非常 ...

  3. PyTorch基础(三)-----神经网络包nn和优化器optim

    前言 torch.nn是专门为神经网络设计的模块化接口.nn构建于Autograd之上,可用来定义和运行神经网络.这里我们主要介绍几个一些常用的类. 约定:torch.nn 我们为了方便使用,会为他设 ...

  4. PyTorch基础-Adam优化器使用-06

    当不知道使用什么优化器的时候可以使用adam优化器 代码 import numpy as np import torch from torch import nn,optim from torch.a ...

  5. 神经网络 梯度下降_梯度下降优化器对神经网络训练的影响

    神经网络 梯度下降 co-authored with Apurva Pathak 与Apurva Pathak合着 尝试梯度下降优化器 (Experimenting with Gradient Des ...

  6. pytorch梯度下降函数_Pytorch中常用的四种优化器SGD、Momentum、RMSProp、Adam

    来源:AINLPer微信公众号 编辑: ShuYini 校稿: ShuYini 时间: 2019-8-16 引言     很多人在使用pytorch的时候都会遇到优化器选择的问题,今天就给大家介绍对比 ...

  7. 【李宏毅2020 ML/DL】P8-9 Optimization for Deep Learnin | 优化器技术总结,SGDM 与 Adam 对比与使用建议

    我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 已经有人记了笔记(很用心,强烈推荐): https://github.com/Sakura-gh/ML-not ...

  8. PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard

    文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...

  9. 系统总结深度学习的主要的损失函数和优化器

    本次博客是深度学习的作业:系统总结了深度学习中监督学习的主要的损失函数,并指出各自的适应条件和优缺点.觉得很有意义,就记录下来供大家参考. 文章目录 损失函数 损失函数的作用 损失函数的分类 基于距离 ...

最新文章

  1. js 动态 添加 tabel 表格
  2. DNS同时占用UDP和TCP端口53——传输数据超过512时候用tcp,DNS服务器可以配置仅支持UDP查询包...
  3. 搭建第一个SpringBoot工程;SpringBoot整合mybatis;SpringBoot整合Redis-cluster集群;SpringBoot整合EhCache;
  4. [leetcode] 874. 行走机器人模拟(周赛)
  5. C语言中的“悬空指针”和“野指针”是什么意思?
  6. 《零基础入门学习Python》学习过程笔记【016列表,元组,字符串的转化及共用技巧】...
  7. TinycoreLinux的安装使用
  8. linux下find用法 find -name *.so -exec ll {} \;
  9. Numpy——数组分割
  10. Windows10下搭建JavaWeb开发环境
  11. html5文字游戏引擎,【HTML5 Game】一步步开发一个 TypeShot 的打字游戏
  12. 马哥Linux学习笔记2-3Linux命令帮助的获取详解
  13. org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection
  14. 微信摇一摇——iBeacon基站(一):USB蓝牙模式
  15. lbp2900linux驱动下载,佳能lbp2900打印机驱动下载|佳能lbp2900打印机驱动下载 通用版_小皮网...
  16. Opencv相机校准之棋盘格标定
  17. 关于_CameraDepthTexture的疑惑
  18. 实现将网页多条磁力链接一次性全部下载
  19. 恢复通讯录显示服务器开小差,手机通讯录误删除怎么恢复?教你几招一看就会...
  20. 91云服务器,GitHub - 91yun/91yuntest: 91云服务器一键测试包

热门文章

  1. Cmake确实应该用到的时候再学
  2. 解剖8051内核如何进行多任务切换
  3. 做人力资源需要掌握python_9种人力资源分析工具,高效打造数字化HR全流程
  4. 生成step文件_利用opencv给彦女王生成一副蒙太奇画像
  5. 数据结构之图:无向图的介绍与功能实现,Python——22
  6. 天池 在线编程 到达终点
  7. LeetCode 第 206 场周赛(733/4491,前16.3%)
  8. 程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)
  9. LeetCode 140. 单词拆分 II(DP+回溯)
  10. java流的传递方式是_java中数据的传递方式到底是怎样的!