第二门课:改善深层神经网络<超参数调试、正则化及优化>-超参数调试、Batch正则化和程序框架

文章目录

  • 1 调试处理
  • 2 为超参数选择合适的范围
  • 3 超参数调试的实践
  • 4 归一化网络的激活函数
  • 5 将Batch Norm拟合进神经网络
  • 6 Batch Norm为什么会奏效?
  • 7 测试时的Batch Norm
  • 8 SoftMax回归
  • 9 训练一个SoftMax分类器
  • 10 深度学习框架
  • 11 TensorFlow

1 调试处理

需要调试的参数:α是最重要的
在这里插入图片描述
在这里插入图片描述

可以采用随机取值,然后选择哪个参数的效果更好。
在这里插入图片描述

由粗糙到精细的策略。即放大表现较好的区域(即小篮框内),然后在其中更密集的取值或随机取值。

2 为超参数选择合适的范围

对于某些超参数(隐藏单元的数量或者神经网络的层数)是可以进行尺度均匀采样的。
某些超参数需要选择不同的合适尺度进行随机采样。随机取值,并不是在范围内均匀取值。
使用对数标尺搜索超参数的方式会更合理
1>比如想取参数 α∈[0.0001,1]
r = -4*np.random.rand(), r∈[−4,0],然后取 α=10r,在 r 的区间均匀取值
2>再比如计算指数的加权平均值参数 β∈[0.9,0.999]
我们考察 1−β∈[0.001,0.1],那么我们令r∈[−3,−1], r 在里面均匀取值, β=1−10r
因为加权平均值大概是基于过去 1\1−β个值进行平均,当 β接近 1 的时候,对细微的变化非常敏感,需要更加密集的取值
当然,如果你使用均匀取值,应用从粗到细的搜索方法,取足够多的数值,最后也会得到不错的结果。

3 超参数调试的实践

在数据更新后,要重新评估超参数是否依然合适
没有计算资源,你可以试验一个或者少量的模型,不断的调试和观察效果(熊猫式)
有计算资源,尽管试验不同参数的模型,最后选择一个最好的(鱼子酱式)

4 归一化网络的激活函数

Batch归一化 会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更加庞大,工作效果也很好,也会使你的训练更加容易.
对于任意一层的输入 我们将其归一化 z1
在这里插入图片描述

但是我们不想让每一层的均值都为0,方差为1,也许有不同的分布有意义,加上2个超参数 γ,β
在这里插入图片描述

γ和β的作用是使隐藏单元值的均值和方差标准化,即z^(i)有固定的均值和方差,均值和方差可以是0和1,也可以是其它值,它是由γ和β两参数控制的。
当γ=\sqrt{σ^2+ε}, β=μ时,那么z(i)波浪线 = z(i)

5 将Batch Norm拟合进神经网络

在这里插入图片描述

Batch归一化的做法是将z[l]值进行Batch归一化,简称BN,此过程将由β[l]和γ[l]两参数控制,这一操作会给出一个寻得规范化的z[l]值<z[l]波浪线>,然后将其输入激活函数中得到a[l],即a[l]=gl。
注意:
1>需要强调的是Batch归一化时发生在计算z和a之间的
2>这里的β,β[1], β[2]和超参数β没有任何关系,Batch归一化中使用β代表此参数(β[1], β[2]等等),而后者是用于Momentum或计算各个指数的加权平均值。
在这里插入图片描述

Mini-batch中与Batch中训练方式相同。
在这里插入图片描述

总结用Batch归一化来应用梯度下降法:
在这里插入图片描述

6 Batch Norm为什么会奏效?

1 使得输入特征、隐藏单元的值获得类似的范围,可以加速学习
2 在前面层输入值改变的情况下,BN 使得他们的均值和方差不变(更稳定),即使输入分布改变了一些,它会改变得更少。
它减弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层都可以自己学习,稍稍独立于其它层,这有助于加速整个网络的学习。
另外,BN 有轻微的正则化效果,因为它在 mini-batch 上计算的均值和方差是有小的噪声,给隐藏单元添加了噪声,迫使后部单元不过分依赖任何一个隐藏单元(类似于 dropout),当增大 mini-batch size ,那么噪声会降低,因此正则化效果减弱。
注:Batch归一化一次只能处理一个mini-batch数据。

7 测试时的Batch Norm

在这里插入图片描述

在一个mini-batch中,计算均值和方差,这里用m表示mini-batch中样本数量,而不是整个数据集。注意到μ和σ2是对单个mini-batch中所有m个样本求得的。
指数加权平均来估算, 这个平均数涵盖了所有 mini-batch (训练过程中计算 μ,σ2 的加权平均)

8 SoftMax回归

SoftMax回归适用于多分类问题

在这里插入图片描述

在神经网络最后一层
在这里插入图片描述

然后计算一个临时变量
在这里插入图片描述

最后将其进行归一化
在这里插入图片描述

SoftMax激活函数与众不同之处在于需要输入一个4×1维向量,然后输出一个4×1维向量。之前,我们的激活函数都是接受单行数值输入,例如Sigmoid和ReLU激活函数,输入一个实数,输出一个实数。SoftMax激活函数的特殊之处在于,因为需要将所有可能的输出归一化,就需要输入一个向量,最后输出一个向量。
没有隐藏层的神经网络:
输出分类的SoftMax层能够代表这种类型的决策边界,请注意这是几条线性决策边界
在这里插入图片描述

9 训练一个SoftMax分类器

SoftMax回归或SoftMax激活函数将logistic激活函数推广到C类,而不仅仅是两类,结果就是如果C=2,那么C=2的SoftMax实际上变回了logistic回归。
训练集中某个样本的真实标签是[0 1 0 0],上个视频中这表示猫,目标输出y帽=[0.3 0.2 0.1 0.4],这里只分配20%是猫的概率,所以这个神经网络在本例中表现不佳。
单个函数的训练集损失函数:
在这里插入图片描述

试图将损失函数L变小,因为梯度下降法是用来减少训练集的损失的,要使它变小的唯一方式就是使y2帽尽可能大,即这项输出概率尽可能的大。
整个训练集损失函数:
在这里插入图片描述

初始化反向传播的关键步骤:

在这里插入图片描述在这里插入图片描述

10 深度学习框架

在这里插入图片描述

选择框架的标准:
1、便于编程,既包括神经网络的开发和迭代,还包括为产品进行配置
2、运行速度,特别是训练大数据集时,一些框架能让你更高效的运行和训练神经网络。
3、框架是否真的开放,不仅需要开源,而且需要良好的管理。

11 TensorFlow

import numpy as np 
import tensorflow as tf#接下来,让我们定义参数w,在TensorFlow中,你要用tf.Variable()来定义参数 
w = tf.Variable(0,dtype = tf.float32) # 定义损失函数 w**2-10w+25
#cost = tf.add(tf.add(w**2,tf.multiply(- 10.,w)),25) 
#TensorFlow还重载了一般的加减运算等,因此可以表示为以下形式
cost = w**2-10*w+25#让我们用0.01的学习率,目标是最小化损失
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) #最后下面的几行是惯用表达式: 
init = tf.global_variables_initializer() 
session = tf.Sessions()
#这样就开启了一个TensorFlow session。 
session.run(init)
#来初始化全局变量。 
#然后让TensorFlow评估一个变量,我们要用到: session.run(w) 
#上面的这一行将w初始化为0,并定义损失函数,我们定义train为学习算法,它用梯度下降法优化器使损失函数最小化,但实际上我们还没有运行学习算法,
#所以session.run(w)评估了w,让我们打印结果: 
print(session.run(w))
#所以如果我们运行这个,它评估等于0,因为我们什么都还没运行。#运行一步梯度下降法。
session.run(train)
#让我们评估一下w的值
print(session.run(w)) 
#0.1 
#在一步梯度下降法之后,w现在是0.1。#现在我们运行梯度下降1000次迭代:
for i in range(1000):session.run(train)
print(session.ran(w)) 
#输出结果:4.99999,与5很接近了。

在这里插入图片描述
#具体代码讲解:

#让它成为[3,1]数组,因为这个二次方程的三项前有固定的系数,我们可以把这些数字1,-10和25变成数据
x = tf.placeholder(tf.float32,[3,1])
#现在x变成了控制这个二次函数系数的数据,这个placeholder函数告诉TensorFlow,你稍后会为x提供数值。
cost = x[0][0]*w**2 +x[1][0]*w + x[2][0]#让我们再定义一个数组(array),
coefficient = np.array([[1.],[-10.],[25.]])#这就是我们要接入x的数据。最后我们需要用某种方式把这个系数数组接入变量x,做到这一点的句法是,在训练这一步中,要提供给x的数值,在这里设置:
feed_dict = {x:coefficients}

在这里插入图片描述

with结构也会在很多TensorFlow程序中用到,它的意思基本上和左边的相同,但是Python中的with命令更方便清理,以防在执行这个内循环时出现错误或例外。


  1. l ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言深度学习-5-深度前馈神经网络

本教程参考《RDeepLearningEssential》 本篇我们将学习如何建立并训练深度预测模型。我们将关注深度前馈神经网络 5.1 深度前馈神经网络 我们还是使用之前提到的H2O包&#xff0c;详细可以见之前的博客&#xff1a;R语言深度学习-1-深度学习入门&#xff08;H2O包安装报错解决…

用 Visual Studio 调试器中查看内存中图像

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 前一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 后一篇&#xff1a; ​警告 本教程可以包含过时的信息。 Image Watch 是 Microsoft Visual Studio 的插件&#xff0c;可用于在调…

Webapi(.net6) 批量服务注册

如果不考虑第三方库&#xff0c;如Autofac这种进行服务注入&#xff0c;通过本身的.Core Weabpi实现的&#xff0c;总结了两种实现方法&#xff0c; 1.一种是参考abp框架里面的形式; 1.1 新建个生命周期的文件夹: 三个接口分别为: public interface IScopedDependency { }pu…

tomcat 实现会话绑定

Tomcat 后端服务器实现 Session ID会话保持 基础架构&#xff1a; 7-6 代理服务器nginx配置 7-3 tomcat 服务器 7-5 同理 测试&#xff1a; 此时刷新&#xff0c;会话ID一直在变&#xff0c;这样不好 如何解决呢&#xff1f; 不好的是确定ip之后&#xff0c;会一直在一台机上…

RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools

RISC-V 编译环境搭建&#xff1a;riscv-gnu-toolchain 和 riscv-tools 编译环境搭建以及说明 操作系统&#xff1a;什么系统都可以 虚拟机&#xff1a;VMmare Workstation Pro 17.50.x (版本不限) 编译环境&#xff1a;Ubuntu 18.04.5 CPU&#xff1a;i7-8750h(虚拟机分配4核…

JVM学习-JMM

目录 1.什么是JMM 2.JMM怎样保障数据的可见性、有序性、原子性 2.1保证原子性 2.2.保证可见性 2.3保证有序性 3.CAS 3.1乐观锁和悲观锁 3.2 CAS介绍 4.重量级锁的自旋优化 1.什么是JMM JMM即Java内存模型 &#xff0c;定义了一套在多线程读写共享数据&#xff08;如数组、成…

openssl3.2 - note - Writing OpenSSL Provider Skeleton

文章目录 openssl3.2 - note - Writing OpenSSL Provider Skeleton概述笔记测试工程的建立复现的provider工程总结Provider包含的头文件openssl/core.h中的数据结构实现 OSSL_provider_init()看一下openssl自带的提供者provider的openssl命令行测试provider的本质是hook了opens…

插入排序:一种简单而有效的排序算法

插入排序&#xff1a;一种简单而有效的排序算法 一、什么是插入排序&#xff1f;二、插入排序的步骤三、插入排序的C语言实现四、插入排序的性能分析五、插入排序的优化六、总结 在我们日常生活和工作中&#xff0c;排序是一种非常常见的操作。比如&#xff0c;我们可能需要对一…

【 c 语言 】指针入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

ChatGPT编程—实现小工具软件(文件查找和筛选)

ChatGPT编程—实现小工具软件(文件查找和筛选) 今天借助[小蜜蜂AI][https://zglg.work]网站的ChatGPT编程实现一个功能&#xff1a;根据特定需求结合通配符和其他条件来进行文件查找和筛选。在这个例子中&#xff0c;我们将创建一个函数find_files&#xff0c;它接受用户输入的…

RK3568平台开发系列讲解(基础篇)内核是如何发送事件到用户空间

🚀返回专栏总目录 文章目录 一、相关接口函数二、udevadm 命令三、实验沉淀、分享、成长,让自己和他人都能有所收获!😄 一、相关接口函数 kobject_uevent 是 Linux 内核中的一个函数, 用于生成和发送 uevent 事件。 它是 udev 和其他设备管理工具与内核通信的一种方式。…

设计模式学习笔记 - 规范与重构 - 8.实践:程序出错返回啥?NULL、异常、错误吗、空对象?重构ID生成器,处理各函数的异常

概述 我们可以把函数的运行结果分为两类。一类是预期结果&#xff0c;也就是正常情况下输出的结果。一类是非预期的结果&#xff0c;也就是函数在异常&#xff08;或出错&#xff09;情况下输出的结果。 在正常情况下&#xff0c;函数返回数据的类型非常明确&#xff0c;但是…

【Spring Boot】创建你的第一个 Spring Boot 应用

创建你的第一个 Spring Boot 应用 1.环境配置2.步骤详解3.项目结构分析3.1 入口类 DemoApplication3.2 控制器 PathVariableController3.3 控制器 BasicController3.4 模型 User 4.运行 Spring Boot 目前已经成为了 Java 开发领域的框架范式。本篇博客&#xff0c;我将带领大家…

layui table列表重载后保持进度条位置不变

使用layui的table表格组件时&#xff0c;当我们操作了某行的修改后&#xff0c;刷新了页面&#xff0c;进度条则跳回到最上面。 除了layui高版本应该内置有方法解决了此问题&#xff0c;但是低版本需要另外想办法解决。 具体解决方式如下&#xff1a; 1.在编辑操作成功前&am…

【List、Set、数据结构、Collections】-Collections

day03 【List、Set、数据结构、Collections】 5.3 简述Comparable和Comparator两个接口的区别。 Comparable&#xff1a;强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序&#xff0c;类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo…

【Linux的 yum_vim工具篇】

Linux学习笔记---004 Linux的yum_vim工具篇1、Linux软件包管理器yum1.1、yum是什么&#xff1f;1.2、软件包是什么&#xff1f;软件包是谁给提供的呢&#xff1f;1.3、Linux系统(其中的centos 7)生态 2、yum的相关操作2.1、yum基本指令格式2.2、软件源 3、yum的本地配置3.1、配…

Lua-Lua与C++的交互2

Lua与C的交互是指在C程序中使用Lua本语言&#xff0c;或者在Lua脚本中调用C代码的过程。这种交互可以实现C与Lua之间的数据传递和函数调用。 在C中与Lua交互的主要步骤如下&#xff1a; 引入Lua库&#xff1a;首先需要在C程序中引入Lua的头文件和库文件&#xff0c;以便能够使…

pytorch中张量变换函数

在PyTorch中view(), transpose() 和 permute() 函数都是用于改变张量&#xff08;Tensor&#xff09;维度结构的&#xff0c;但它们的作用和使用场景有所不同。 torch.view() 功能&#xff1a;该函数用于将一个张量重塑为新的形状&#xff0c;但它必须保持原有元素数量不变。它…

【MASM汇编语言快速入门】8086MASM汇编深入理解指令对标志位的影响

8086MASM汇编深入理解指令对标志位的影响 文章目录 8086MASM汇编深入理解指令对标志位的影响0. 指令对标志位影响1. 指令对标志位影响速查表2. flags标志寄存器: 标志位含义解读flags1. 状态标志cf, pf, af, zf, sf, of2. 控制标志df, if, tf 详解&#xff1a;1. 传送指令2. 算…

如何在IDEA 中设置背景图片

在IDEA 中设置背景图片&#xff0c;可以按照以下步骤操作&#xff1a; 1、打开 IntelliJ IDEA 软件&#xff0c;进入代码编辑主界面。 点击编辑窗口上方的“File”菜单项。 2、在下拉子菜单中&#xff0c;选择“Settings”选项&#xff08;如果你使用的是 macOS&#xff0c;可…