深度学习原理与框架- batch_normalize(归一化操作)

1. batch_normalize(归一化操作),公式:传统的归一化公式 (number - mean) / std, mean表示均值, std表示标准差

而此时的公式是 scale * (num - mean) / std + beta  #scale 和 beta在计算的过程中会进行不断的更新,以使得数据可以产生多样性的分步

即 经过一次卷积层后,进行一次归一化操作,同时进行一次激活操作

   x = conv_layer(x, [5, 5, 3, 64], 1)
   x = batch_normalize(x, is_training)
   x = tf.nn.relu(x)

归一化操作,比如x = [32, 32, 64, 128]  第一个32表示宽,第二个32表示长,64表示通道数,128表示feature_map的个数

使用batch_mean, batch_var = tf.nn.moments(x, [0, 1, 2]), 求出前三个通道的均值和标准差,此时的维度为(128, )

在训练的过程中,因为每次获得的图像个数都是batch_size, 因此使用动量平均的方法,来获得平均的均值和标准差

使用tf.Variable()构造pop_mean 和 pop_var, trainable = FALSE

使用train_mean = tf.assign(pop_mean, pop_mean*decay + batch_mean*(1-decay))  # pop_mean表示上一次的均值,batch_mean表示当前的x的均值

使用train_var = tf.assign(pop_var, pop_var*decay + batch_var*(1-decay))  # pop_var表示上一次的标准差, batch_var表示当前的x的标准差

使用with tf.control_dependecies([train_mean, train_var]):  在执行batch_normalization的时候会对train_mean 和 train_var进行操作,更新pop_mean 和 pop_var

return tf.nn.batch_normalization(x,  batch_mean, batch_var, beta, scale, epsilon),

下面是代码:

def batch_normalize(x, is_training, decay=0.99, epsilon=0.001):
    # 定义训练过程中的归一化操作
    def bn_train():
        # 获得前三个通道的均值和标准差
        batch_mean, batch_var = tf.nn.moments(x, axes=[0, 1, 2])
        # 均值获得动量平均的均值,即pop_mean * decay + batch_mean * (1-decay)
        train_mean = tf.assign(pop_mean, pop_mean * decay + batch_mean * (1 - decay))
        # 标准差获得动量平均的标准差,即pop_var * decay + batch_var * (1 - decay)
        train_var = tf.assign(pop_var, pop_var * decay + batch_var * (1 - decay))
        # 使用tf.control_dependencies表示在执行下一步操作前,会进行train_mean和train_var操作,进行参数的更新
        with tf.control_dependencies([train_mean, train_var]):
            # 进行归一化操作
            return tf.nn.batch_normalization(x, batch_mean, batch_var, beta, scale, epsilon)
    # 定义测试阶段的归一化操作
    def bn_inference():
        # 使用训练过程中的动量平均的平均值和标准差,作为均值和标准差的输入
        return tf.nn.batch_normalization(x, pop_mean, pop_var, beta, scale, epsilon)
    # 获得最后一个通道数,即features的个数
    dim = x.get_shape().as_list()[-1]
    # 构造beta, 即偏差, 用于与归一化后的数据进行相加操作, 在训练过程中会进行更新操作
    beta = tf.get_variable(
        name=‘beta‘,
        shape=[dim],
        dtype=tf.float32,
        initializer=tf.truncated_normal_initializer(stddev=0.0),
        trainable=True)
    # 构造scale,用于与归一化后的数据进行相乘操作,在训练过程中进行更新
    scale = tf.get_variable(
        name=‘scale‘,
        shape=[dim],
        dtype=tf.float32,
        initializer=tf.truncated_normal_initializer(stddev=0.1),
        trainable=True)
    # 用于构建动量平均的平均值
    pop_mean = tf.get_variable(
        name=‘pop_mean‘,
        shape=[dim],
        dtype=tf.float32,
        initializer=tf.constant_initializer(0.0),
        trainable=False)
    # 用于构建动量平均的标准差
    pop_var = tf.get_variable(
        name=‘pop_var‘,
        shape=[dim],
        dtype=tf.float32,
        initializer=tf.constant_initializer(1.0),
        trainable=False)
    # 如果is_training 等于 True,执行bn_train操作,否者执行bn_inference操作
    return tf.cond(is_training, bn_train, bn_inference)

原文地址:https://www.cnblogs.com/my-love-is-python/p/10617885.html

时间: 2024-10-09 18:29:21

深度学习原理与框架- batch_normalize(归一化操作)的相关文章

深度学习原理与框架-递归神经网络-RNN网络基本框架(代码?) 1.rnn.LSTMCell(生成单层LSTM) 2.rnn.DropoutWrapper(对rnn进行dropout操作) 3.tf.contrib.rnn.MultiRNNCell(堆叠多层LSTM) 4.mlstm_cell.zero_state(state初始化) 5.mlstm_cell(进行LSTM求解)

问题:LSTM的输出值output和state是否是一样的 1. rnn.LSTMCell(num_hidden, reuse=tf.get_variable_scope().reuse)  # 构建单层的LSTM网络 参数说明:num_hidden表示隐藏层的个数,reuse表示LSTM的参数进行复用 2.rnn.DropoutWrapper(cell, output_keep_prob=keep_prob) # 表示对rnn的输出层进行dropout 参数说明:cell表示单层的lstm,o

深度学习原理与框架-神经网络-cifar10分类(代码)

cifar神经网络的代码说明: 数据主要分为三部分: 第一部分:数据的准备 第二部分:神经网络模型的构造,返回loss和梯度值 第三部分:将数据与模型输入到函数中,用于进行模型的训练,同时进行验证集的预测,来判断验证集的预测结果,保留最好的验证集结果的参数组合 第一部分:数据的准备 第一步:构造列表,使用with open() as f: pickle.load进行数据的载入, 使用.reshape(1000, 3, 32, 32).transpose(0, 3, 1, 2).astype('f

深度学习原理与框架-Tensorflow卷积神经网络-神经网络mnist分类

使用tensorflow构造神经网络用来进行mnist数据集的分类 相比与上一节讲到的逻辑回归,神经网络比逻辑回归多了隐藏层,同时在每一个线性变化后添加了relu作为激活函数, 神经网络使用的损失值为softmax概率损失值,即为交叉熵损失值 代码:使用的是mnist数据集作为分类的测试数据,数据的维度为50000*784 第一步:载入mnist数据集 第二步:超参数的设置,输入图片的大小,分类的类别数,迭代的次数,每一个batch的大小 第三步:使用tf.placeholder() 进行输入数

深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expand_dim(增加输入数据的维度) 4.tf.tile(在某个维度上按照倍数进行平铺迭代) 5.tf.squeeze(去除维度上为1的维度)

1. rnn.BasicLSTMCell(num_hidden) #  构造单层的lstm网络结构 参数说明:num_hidden表示隐藏层的个数 2.tf.nn.dynamic_rnn(cell, self.x, tf.float32) # 执行lstm网络,获得state和outputs 参数说明:cell表示实例化的rnn网络,self.x表示输入层,tf.float32表示类型 3. tf.expand_dim(self.w, axis=0) 对数据增加一个维度 参数说明:self.w表

深度学习原理与框架-递归神经网络-时间序列预测

代码说明:使用的是单层的rnn网络,迭代的终止条件为,第n的100次循环的损失值未降低次数超过3次,即跳出循环 数据说明:使用的是乘客的人数,训练集和测试集的分配为0.8和0.2, train_x使用的是前5个数据,train_y使用的是从2个数据到第6个数据,以此往后类推 代码: 第一部分:数据的读入,并将数据拆分为训练集和测试集,同时构造train_x, train_y, test_x, test_y, 每一个train的大小为5, 1 第二部分:实例化模型,同时对模型进行训练操作 第三部分

深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)

1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说明一下:即根据每一行X中的一个数,从W中取出对应行的128个数据,比如X[1, 3]个数据是3062,即从W中的第3062行取出128个数据 import numpy as np import tensorflow as tf data = np.array([[2, 1], [3, 4], [5,

深度学习原理与框架-卷积网络细节-经典网络架构 1.AlexNet 2.VGG

1.AlexNet是2012年最早的第一代神经网络,整个神经网络的构架是8层的网络结构.网络刚开始使用11*11获得较大的感受野,随后使用5*5和3*3做特征的提取,最后使用3个全连接层做得分值得运算,使用的是softmax分类器 2. VGG-net,网络的特点是全部使用3*3的卷积,通常有两个版本一个是16-VGG和19-VGG,每一进行完一次maxpool,都进行一次维度的提升,为了减少由于降维压缩而导致的信息损失.最后使用3个全连接层进行得分值得预测,使用的是softmax计算损失值 原

对比深度学习十大框架:TensorFlow 并非最好?

http://www.oschina.net/news/80593/deep-learning-frameworks-a-review-before-finishing-2016 TensorFlow 链接:https://www.tensorflow.org/ 对于那些听说过深度学习但还没有太过专门深入的人来说,TensorFlow 是他们最喜欢的深度学习框架,但在这里我要澄清一些事实. 在 TensorFlow 的官网上,它被定义为「一个用于机器智能的开源软件库」,但我觉得应该这么定义:Te

对比学习资料《深度学习入门:基于Python的理论与实现》+《深度学习原理与实践》+《深度学习理论与实战基础篇》电子资料

我认为<深度学习入门:基于Python的理论与实现>电子书代码基本原理,简洁清楚,所用数学基本就是大一水平,适合做第一本入门书. <深度学习入门:基于Python的理论与实现>书代码实现的神经网络全是用numpy,超级适合刚刚入门想了解神经网络,数学不好看公式看不懂的人,看完这本基本就懂深度学习是弄啥子了. 如果连这本都看不懂的话,可以去看<Python神经网络编程>.我个人认为这两本书是最简单直白的方式让人理解神经网络的了. <深度学习原理与实践>电子书代