2.3 调试神经网络(调整超参数、归一化隐藏层Batch Normalization、softmax激活函数处理多分类问题、安装与使用TensorFlow)

注意:这一篇安装的TensorFlow是1.0版本,已经废弃,请读者不要安装。

调整超参数

重要程度

  • 最重要

    • 学习率 α;(或者说 学习率r)
  • 其次重要

    • β:动量衰减参数,常设置为 0.9;  # from 动量梯度下降
    • 各隐藏层神经元个数n;  # hidden units
    • mini-batch 的大小;
  • 再次重要

    • β1,β2,ϵ:常设为 0.9、0.999、10−810−8;  # from Adam优化算法
    • 神经网络层数L;      # layers
    • decay_rate:学习衰减率;

搜索方法:随机搜索法

若发现某个区域内的点的值都不错。那么我们会把搜索范围缩小到这个区域。对这个区域再次进行更加精密的搜索。

选择合适的范围

线性标尺:

指数标尺:

  • 对于学习率 α,用指数标尺更加合理:0.0001、0.001、0.01、0.1 等,然后在这些刻度之间再随机均匀取值;
  • 对于 β,假设它的取值范围是0.9到0.999。还记得之前我们学到过,0.9就代表着趋势平均值会受到前面10个值的影响,而0.999就表示会受到前面1000个值的影响,这个是根据公式1/1-β而得来的。这个超参数也应该使用指数标尺。但是怎么使用呢?这个时候我们可以把求β转化成求1-B=0.1,....,0.001,那么我们又可以用上面学习率的调参方法来进行采样了。

为什么有些超参数必须要使用指数标尺呢?

因为那些超参数对有些变化特别的敏感。

例如β从0.9000变成0.9005时影响并不大,还是1/0.1,结果(趋势值)还是受前面10个值的影响。

而如果从0.9990变成0.9995,那么就会"多"受前面1000个值的影响,(0.9990时受前面1000个值影响,0.9995时就要受前面约2000个值的影响了),  这个现象主要来源于公式1/1-β。

不同领域的参数有"互通性"和"过时性"

调参模式

熊猫宝宝式:

我有海量的数据,有限的CPU,无法同时训练很多模型,那么就需要这种情况。

最初随机地初始化一些超参数值,然后观察模型的表现状况,观察模型的损失曲线,或者是观察模型验证集的错误率曲线。

我们发现训练模型第一天学习的状况不错,那么我们可以尝试将学习率再调大一点点,看看模型的表现会是如何。可能会学得更快了,也可能会变得糟糕起来了;第二天你发现模型的学习状况依然不错,这时你可以尝试加入动量梯度下降算法看看模型表现得又会是如何;就这样,每天你都根据模型的学习状况来尝试不同的超参数值;如果某天发现模型的表现变差了,那么你可以将超参数返回到前一天的值。

鱼卵宝宝模式:

机器资源足够,同时训练海量的模型。

每一个模型都被设置了不同的超参数值,结果有些会表现得很好,有些会表现得很差。

归一化隐藏层

批标准化(Batch Normalization,经常简称为 BN)

输入特征-->归一化

这个时候z的平均值变成了0,方差变成了1.

输入层喜欢这样,隐藏层还需要另外处理,希望z可以分布在坐标系的任意位置。

隐藏层-->归一化

上式中的γ和β是像w和b一样的参数,是神经网络可以根据学习而不断改变优化的参数,即神经网络会不断地优化z的
分布位置。 

γ可以控制方差,β可以控制平均值

举个极端的例子:假设将γ设置为,并且将β设置为u,那么结合第二步和第二步的公式,就会发现它们
对z的处理都被抵消了,也就是说,通过将y和β设置为上面的极端值后就撤销了对z的平均值和方差的修改。

同理,通过设置y和β的值就可以为z设置任意的平均值和方差。

归一化隐藏层的好处

1.使得成本函数J圆圆的,更容易梯度下降

2.使得隐藏层的z更加稳定,提升学习效率

3.使z的变化幅度小一点,更容易学到东西 (小孩子多看一类的东西,就学到了;看很多类,就不知道怎么回事。)

测试时怎么办

训练的时候,通过大量的数据,我们根据所有的z得到了u,

但是真正预测的时候,我们只用一个样本,一个列向量,如何得到u和

常见方法:根据所有mini-batch的u和,计算得出他们的指数加权平均值,最终用这个。

 的计算同理。

softmax

简述

以往结果 0==不是猫,1==是猫,这是二分类

使用softmax激活函数之后,比如:可以通过1234..不同的数字来代表,去识别 这张图是 猫/狗/鸡/鸭 等

对于这样的多分类问题,用 C 表示种类个数,则神经网络输出层,也就是第 L 层的单元数量 

上例中,输出层是4个单元。每个神经元的输出依次对应属于该类的概率,即。sum=1。

softmax激活函数的实现

直观的例子

表示的t向量每个元素 在sum(t)中的占比,sum(输出结果)=1。

深入理解softmax

harmmax == 输出结果 1000  0100 0010 0001,这很强硬;而 softmax == 概率 概率 概率 概率,这很柔软;

训练集中,标签 ; 自己的预测 ;  这个例子中,说明预测错了。

损失函数和成本函数

因为只有一个是1,其他都是0,所以公式简化为

反向传播(梯度下降)的目的,就是调整w、b,从而使得J最小,其实就是要让最大,其实(y'2)最大也说明预测越准确。就是通过调整w、b,使得J小了、y'2大了,自然就是说明预测越准确,接近训练集里的真实情况。

简单使用TensorFlow

已知,即,请用tf找出这个w,使得J最小

使用脑子算:显然,w=5的时候,J最小。

使用tf算(只需要定义好前向传播,他自己就给你设计好反向传播了):

定义变量w:

定义J(w)函数:

因为

# tf重载了操作符,可以用简洁的形式表达

使用梯度下降的实例对象(学习率0.01)来优化cost,train变量表示这个操作:

固定的表达形式(创建session对象,通过session对象执行操作):

# 最后一行代表 获取w当前的值,然后打印出来。

运行一次,w的值发生了变化:

运行1000次,w接近了正确值:

占位符placehold的使用

定义一个占位符x,它是维度为(3,1)的float列向量,只站位,没数值:

cost函数替换成占位符的元素:

创建一个有实际数值的向量(维度==占位符的维度):

填充到占位符中,并且运行:

完整代码:

import numpy as np
import tensorflow as tf

cofficients = np.array([[1.],[-10.],[25.]])

w = tf.Variable(0,dtype=tf.float32)
x = tf.placeholder(tf.float32,[3,1])
# Tensorflow 重载了加减乘除符号
cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
# 改变下面这行代码,可以换用更好的优化算法
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)

init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)
for i in range(1000):
    session.run(train, feed_dict=(x:coefficients))
print(session.run(w))

TF安装

1.创建一个环境,环境名字是tensorflow,用的python版本是3.5 

(如果3.6/3.7版本,对tf2.0是很好的,但是初学 不管那么多了)

方法:在prompt中,输入conda create -n tensorflow python=3.5  如果问继续么(proceed?),就输入y

成功标志:

2.切换到这个环境

activate tensorflow

3.从镜像安装TensorFlow,否则极其慢!

从豆瓣镜像安装最新版(不选择这个)

# pip install --index-url https://pypi.douban.com/simple tensorflow 

# 不要安装这个,版本挺新的,否则之后文档里面的函数都用不了,跑不起来

我安装这个的时候,两个包出现了问题:

tensorboard 2.3.0 has requirement setuptools>=41.0.0, but you'll have setuptools 40.2.0 which is incompatible.
google-auth 1.21.1 has requirement setuptools>=40.3.0, but you'll have setuptools 40.2.0 which is incompatible.

我尝试了如下:

升级pip:python -m pip install --upgrade pip   他说2021年 pip高级版本就不支持python3.5了。。啊这。。

升级这个需要的包:pip install --upgrade setuptools  升级好了

我再安装一遍tf:pip install --index-url https://pypi.douban.com/simple tensorflow  发现没啥用。。

想想算了,tensorboard就是个板子,用来演示的,不安装也罢

不管了……

# 据说:移动本机已有的包到anaconda的环境里面 就是那个文件里面, 需要自己update一下index 就不用挨个pip了

最终还是选择安装1.12版本

pip install --ignore-installed  --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.12.0-cp35-cp35m-win_amd64.whl 

# 1.12版本  虽然有点老,但是入门而已,就装这个。

4.conda install ipython

5.conda install jupyter

6.ipython kernelspec install-self -user

发现多了个这个:

运行就可以了。

# 另外 会有个warning  如果是关于numpy的 那就是版本过高,解决办法:pip install numpy==1.16.0

代码

https://gitee.com/bijingrui1997/deep_learning_notes/tree/master/2.3%20%E8%B0%83%E8%AF%95%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值