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)

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

  1. 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)

    1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...

  2. 深度学习原理与框架-图像补全(原理与代码) 1.tf.nn.moments(求平均值和标准差) 2.tf.control_dependencies(先执行内部操作) 3.tf.cond(判别执行前或后函数) 4.tf.nn.atrous_conv2d 5.tf.nn.conv2d_transpose(反卷积) 7.tf.train.get_checkpoint_state(判断sess是否存在

    1. tf.nn.moments(x, axes=[0, 1, 2])  # 对前三个维度求平均值和标准差,结果为最后一个维度,即对每个feature_map求平均值和标准差 参数说明:x为输入的fe ...

  3. 深度学习原理与框架-Alexnet(迁移学习代码) 1.sys.argv[1:](控制台输入的参数获取第二个参数开始) 2.tf.split(对数据进行切分操作) 3.tf.concat(对数据进行合并操作) 4.tf.variable_scope(指定w的使用范围) 5.tf.get_variable(构造和获得参数) 6.np.load(加载.npy文件)

    1. sys.argv[1:]  # 在控制台进行参数的输入时,只使用第二个参数以后的数据 参数说明:控制台的输入:python test.py what, 使用sys.argv[1:],那么将获得w ...

  4. 深度学习原理与框架-递归神经网络-时间序列预测(代码) 1.csv.reader(进行csv文件的读取) 2.X.tolist(将数据转换为列表类型)

    1. csv.reader(csvfile) # 进行csv文件的读取操作 参数说明:csvfile表示已经有with oepn 打开的文件 2. X.tolist() 将数据转换为列表类型 参数说明 ...

  5. 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)

    1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...

  6. 深度学习原理与框架- tf.nn.conv2d_transpose(反卷积操作) tf.nn.conv2d_transpose(进行反卷积操作) 对于stride的理解存在问题?

    反卷积操作: 首先对需要进行维度扩张的feature_map 进行补零操作,然后使用3*3的卷积核,进行卷积操作,使得其维度进行扩张,图中可以看出,2*2的feature经过卷积变成了4*4.    ...

  7. 深度学习原理与框架-递归神经网络-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)  # 构建 ...

  8. 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)

    1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')  # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...

  9. 深度学习原理与框架-Tensorflow基本操作-mnist数据集的逻辑回归 1.tf.matmul(点乘操作) 2.tf.equal(对应位置是否相等) 3.tf.cast(将布尔类型转换为数值类型) 4.tf.argmax(返回最大值的索引) 5.tf.nn.softmax(计算softmax概率值) 6.tf.train.GradientDescentOptimizer(损失值梯度下降器)

    1. tf.matmul(X, w) # 进行点乘操作 参数说明:X,w都表示输入的数据, 2.tf.equal(x, y) # 比较两个数据对应位置的数是否相等,返回值为True,或者False 参 ...

随机推荐

  1. day01知识点

    1.计算机基础 2.Python的历史 3.编码语言分类     Python是一门动态解释性的强制类型定义语言 4.Python的解释器种类 5.变量     法律规则:字母,数字,下划线(数字不能 ...

  2. char* 与 string 互转

    因为c#强调安全性,每次意图将string的地址赋给指针时,系统都要报错,原因是系统无法计算字符串的空间和地址,这里不多bb,使用IntPtr类(using Runtime.InteropServic ...

  3. python selenium-webdriver 登录验证码的处理(十二)

    很多系统为了防止坏人,会增加各样形式的验证码,做测试最头痛的莫过于验证码的处理,验证码的处理一般分为三种方法 1.开发给我们设置一个万能的验证码: 2.开发将验证码给屏蔽掉: 3.自己识别图片的上的千 ...

  4. 嵌入式C语言预处理使用

    #include  包含头文件 #define 宏 #define 宏名 (宏体)    //不进行语法检查 #define ABC(x) (5+(x))    //宏函数 #define #else ...

  5. [转]本文采用all-in-one(一体化的)安装OpenShift

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_21816375/article/details/73656494本文采用all-in-one( ...

  6. 谷歌浏览器添加JSON-handle插件

    访问谷歌应用商店必须FQ,具体可安装谷歌访问助手:http://www.cnblogs.com/yangcx666/p/8783642.html 不想FQ的可以百度 "谷歌插件网" ...

  7. HashMap解读

    个人理解,欢迎提出问题

  8. 联想扬天3900c电脑BIOS设置U盘启动图文教程

    有联想扬天3900c的用户反映说,制作好U大侠U盘后,按快捷键却识别不到U盘,不能进行U盘启动,这是怎么回事呢?其实这是BIOS设置的问题,下面U大侠教大家如何对联想扬天3900c电脑进行BIOS设置 ...

  9. 洛谷P1040 加分二叉树(树形dp)

    加分二叉树 时间限制: 1 Sec  内存限制: 125 MB提交: 11  解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...

  10. centos7安装nginx,以及使用node测试反向代理

    1.添加nginx的安装源 vi /etc/yum.repos.d/nginx.repo 2.输入下面内容,并保存退出 [nginx] name=nginx repo baseurl=http://n ...