深度学习原理与框架- 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)
深度学习原理与框架- batch_normalize(归一化操作)的更多相关文章
- 深度学习原理与框架-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进行响应归一化操作 参数 ...
- 深度学习原理与框架-图像补全(原理与代码) 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 ...
- 深度学习原理与框架-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 ...
- 深度学习原理与框架-递归神经网络-时间序列预测(代码) 1.csv.reader(进行csv文件的读取) 2.X.tolist(将数据转换为列表类型)
1. csv.reader(csvfile) # 进行csv文件的读取操作 参数说明:csvfile表示已经有with oepn 打开的文件 2. X.tolist() 将数据转换为列表类型 参数说明 ...
- 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 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表示变 ...
- 深度学习原理与框架- tf.nn.conv2d_transpose(反卷积操作) tf.nn.conv2d_transpose(进行反卷积操作) 对于stride的理解存在问题?
反卷积操作: 首先对需要进行维度扩张的feature_map 进行补零操作,然后使用3*3的卷积核,进行卷积操作,使得其维度进行扩张,图中可以看出,2*2的feature经过卷积变成了4*4. ...
- 深度学习原理与框架-递归神经网络-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) # 构建 ...
- 深度学习原理与框架-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 ...
- 深度学习原理与框架-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 参 ...
随机推荐
- Pycharm桌面图标(Fedora)
1.解压pycharm压缩包至/usr/local/pycharm文件夹下 2.在/usr/share/applications/目录下,新建Pycharm.desktop文件,内容如下: [Desk ...
- JAVA基础搬运工
1Java线程的6种状态及切换 https://blog.csdn.net/pange1991/article/details/53860651/ 2进程和线程的区别 https://www.cnbl ...
- 宝塔linux面板 解决TP3.2 404
在配置文件中加入一下配置: location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1; } } location ...
- 20175202 《Java程序设计》第六周学习总结
20175202 2018-2019-2 <Java程序设计>第六周学习总结 教材知识点总结 1.内部类: Java支持在一个类中定义另一个类,称作内部类,包含内部类的类叫做外嵌类. 内部 ...
- spring事务详解(五)总结提高
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...
- pyhanlp:hanlp的python接口
HanLP的Python接口,支持自动下载与升级HanLP,兼容py2.py3. 安装 pip install pyhanlp 使用命令hanlp来验证安装,如因网络等原因自动安装失败,可参考手动配置 ...
- Javascript 使用postMessage对iframe跨域传值或通信
实现目标:两个网站页面实现跨域相互通信 当前例子依赖于 jQuery 3.0 父页面代码:www.a.com/a.html <iframe id="myIframe" src ...
- A* 算法的原理
参考下面的博客内容, 已经写的很详细了, 就不用重复写了. https://blog.csdn.net/haxiongha/article/details/81357687
- Guava - Ordering
guava中Ordering类是对Compartor接口的实现,但它也只是一个抽象类. 当调用Ordering.natural()方法时,它就会返回一个NaturalOrdering的对象,Natur ...
- Group(), Groups(),& Groupdict() 用法
group() 返回一个或多个匹配的字串.如果只有一个参数,结果只有单个字符串:如果有多个参数,结果是一个元组,元组里每一项对应一个参数.没有参数,group1默认是0(整个匹配串被返回).如果gro ...