批量归一化batch_normalization

为了解决在深度神经网络训练初期降低梯度消失/爆炸问题,Sergeyloffe和ChristianSzegedy提出了使用批量归一化的技术的方案,该技术包括在每一层激活函数之前在模型里加一个操作,简

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

为了解决在深度神经网络训练初期降低梯度消失/爆炸问题,Sergey loffe和Christian Szegedy提出了使用批量归一化的技术的方案,该技术包括在每一层激活函数之前在模型里加一个操作,简单零中心化和归一化输入,之后再通过每层的两个新参数(一个缩放,另一个移动)缩放和移动结果,话句话说,这个操作让模型学会最佳模型和每层输入的平均值

批量归一化原理

(1)\(\mu_B = \frac{1}{m_B}\sum_{i=1}^{m_B}x^{(i)}\) #经验平均值,评估整个小批量B

(2)\(\theta_B = \frac{1}{m_B}\sum_{i=1}^{m_b}(x^{(i)} – \mu_B)^2\) #评估整个小批量B的方差

(3)\(x_{(i)}^* = \frac{x^{(i)} – \mu_B}{\sqrt{\theta_B^2+\xi}}\)#零中心化和归一化

(4)\(z^{(i)} = \lambda x_{(i)}^* + \beta\)#将输入进行缩放和移动

在测试期间,没有小批量的数据来计算经验平均值和标准方差,所有可以简单地用整个训练集的平均值和标准方差来代替,在训练过程中可以用变动平均值有效计算出来

但是,批量归一化的确也给模型增加了一些复杂度和运行代价,使得神经网络的预测速度变慢,所以如果逆需要快速预测,可能需要在进行批量归一化之前先检查以下ELU+He初始化的表现如何

tf.layers.batch_normalization使用

函数原型

def batch_normalization(inputs,
                    axis=-1,
                    momentum=0.99,
                    epsilon=1e-3,
                    center=True,
                    scale=True,
                    beta_initializer=init_ops.zeros_initializer(),
                    gamma_initializer=init_ops.ones_initializer(),
                    moving_mean_initializer=init_ops.zeros_initializer(),
                    moving_variance_initializer=init_ops.ones_initializer(),
                    beta_regularizer=None,
                    gamma_regularizer=None,
                    beta_constraint=None,
                    gamma_constraint=None,
                    training=False,
                    trainable=True,
                    name=None,
                    reuse=None,
                    renorm=False,
                    renorm_clipping=None,
                    renorm_momentum=0.99,
                    fused=None,
                    virtual_batch_size=None,
                    adjustment=None):

使用注意事项

(1)使用batch_normalization需要三步:

a.在卷积层将激活函数设置为None
b.使用batch_normalization
c.使用激活函数激活

例子:
inputs = tf.layers.dense(inputs,self.n_neurons,
                                   kernel_initializer=self.initializer,
                                   name = 'hidden%d'%(layer+1))
if self.batch_normal_momentum:
    inputs = tf.layers.batch_normalization(inputs,momentum=self.batch_normal_momentum,train=self._training)

inputs = self.activation(inputs,name = 'hidden%d_out'%(layer+1))

(2)在训练时,将参数training设置为True,在测试时,将training设置为False,同时要特别注意update_ops的使用

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
需要在每次训练时更新,可以使用sess.run(update_ops)
也可以:
with tf.control_dependencies(update_ops):
    train_op = tf.train.AdamOptimizer(learning_rate).minimize(loss)

使用mnist数据集进行简单测试

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import numpy as np
mnist = input_data.read_data_sets('MNIST_data',one_hot=True)
x_train,y_train = mnist.train.images,mnist.train.labels
x_test,y_test = mnist.test.images,mnist.test.labels
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
he_init = tf.contrib.layers.variance_scaling_initializer()
def dnn(inputs,n_hiddens=1,n_neurons=100,initializer=he_init,activation=tf.nn.elu,batch_normalization=None,training=None):
    for layer in range(n_hiddens):
        inputs = tf.layers.dense(inputs,n_neurons,kernel_initializer=initializer,name = 'hidden%d'%(layer+1))
        if batch_normalization is not None:   
            inputs = tf.layers.batch_normalization(inputs,momentum=batch_normalization,training=training)
        inputs = activation(inputs,name = 'hidden%d'%(layer+1))
    return inputs
tf.reset_default_graph()
n_inputs = 28*28
n_hidden = 100
n_outputs = 10

X = tf.placeholder(tf.float32,shape=(None,n_inputs),name='X')
Y = tf.placeholder(tf.int32,shape=(None,n_outputs),name='Y')

training = tf.placeholder_with_default(False,shape=(),name='tarining')
dnn_outputs = dnn(X)

logits = tf.layers.dense(dnn_outputs,n_outputs,kernel_initializer = he_init,name='logits')
y_proba = tf.nn.softmax(logits,name='y_proba')
xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y,logits=y_proba)
loss = tf.reduce_mean(xentropy,name='loss')
train_op = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)

correct = tf.equal(tf.argmax(Y,1),tf.argmax(y_proba,1))
accuracy = tf.reduce_mean(tf.cast(correct,tf.float32))

epoches = 20
batch_size = 100
np.random.seed(42)

init = tf.global_variables_initializer()
rnd_index = np.random.permutation(len(x_train))
n_batches = len(x_train) // batch_size
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(epoches):       
        for batch_index in np.array_split(rnd_index,n_batches):
            x_batch,y_batch = x_train[batch_index],y_train[batch_index]
            feed_dict = {X:x_batch,Y:y_batch,training:True}
            sess.run(train_op,feed_dict=feed_dict)
        loss_val,accuracy_val = sess.run([loss,accuracy],feed_dict={X:x_test,Y:y_test,training:False})
        print('epoch:{},loss:{},accuracy:{}'.format(epoch,loss_val,accuracy_val))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120021.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab三维图形的绘制[通俗易懂]

    matlab三维图形的绘制[通俗易懂]采用matlab进行三维图绘制mesh函数:网格图mesh(x,y,z)x是n维向量,y是m维向量,z是m*n维向量等高线,底座surf函数:曲面符号隐函数绘图

    2022年10月11日
    0
  • 关于RewriteCond的内容

    关于RewriteCond的内容 RewriteCond Syntax:RewriteCondTestStringCondPattern[flags]   RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。   TestString是一个字符串,除了包

    2022年5月2日
    36
  • 网页死链检测方法「建议收藏」

    网页死链检测方法「建议收藏」 了解测试方法之前,先了解下死链、链接的相关概念死链的种类协议死链:页面的TCP协议状态/HTTP协议状态明确表示的死链, 常见的如404、403、503状态等。 内容死链:服务器返回状态是正常的, 但内容已经变更 为不存在、已删除或需要权限等与原内容无关的信息页面。死链出现的原因网站目录更换。 服务器里某个文件移动了位置或者删除。 网站服务器设置错误。 动态链接在数据…

    2022年7月23日
    34
  • Linux——./configure && make && make install命令解析

    Linux——./configure && make && make install命令解析当我们在Linux上安装相关的软件源码包时,一般会涉及到以下三个步骤,分别是 ./configure、make、make install————————————————————————————————————————————————————第一步./configure 该步骤主要用来检测系统的配置、环境以及相关依赖,如果缺少相关依赖,该脚本会中止执行,软件安装失败如:它会检…

    2022年6月13日
    38
  • Java服务器热部署的实现原理

    Java服务器热部署的实现原理今天发现早年在大象笔记中写的一篇笔记,之前放在ijavaboy上的,现在它已经访问不了了。前几天又有同事在讨论这个问题。这里拿来分享一下。在web应用开发或者游戏服务器开发的过程中,我们时时刻刻都在使用热部署。热部署的目的很简单,就是为了节省应用开发和发布的时间。比如,我们在使用Tomcat或者Jboss等应用服务器开发应用时,我们经常会开启热部署功能。热部署,简单点来说,就是我们将打

    2022年5月21日
    24
  • 美国100部推理小说排行榜第一_好看的悬疑小说排行榜前十名

    美国100部推理小说排行榜第一_好看的悬疑小说排行榜前十名这份书单是美国推理作家协会(TheMysteryWritersofAmerica,简称MWA)票选出来的史上最经典的一百部推理小说排行榜。评选过程极为复杂,首先由推理协会选出本格派、硬汉派、惊悚派、间谍小说等推理小说十个主要流派的十个代表作家,再由这十个作家选出各流派的十部代表作品,然后由协会会员投票排出名次。所以这份书单不仅仅有总的一百强排行榜,还有各个不同流派的十大杰作排名,其中本格和…

    2022年9月28日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号