Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow:使用批量标准化会导致较差(不稳定)的验证损失和准确性_Tensorflow_Machine Learning_Deep Learning_Conv Neural Network_Batch Normalization - Fatal编程技术网

Tensorflow:使用批量标准化会导致较差(不稳定)的验证损失和准确性

Tensorflow:使用批量标准化会导致较差(不稳定)的验证损失和准确性,tensorflow,machine-learning,deep-learning,conv-neural-network,batch-normalization,Tensorflow,Machine Learning,Deep Learning,Conv Neural Network,Batch Normalization,我正在尝试使用批处理规范化,我的代码如下所示: def create_conv_exp_model(指纹输入、模型设置、is_培训): #辍学占位符 如果是大学培训: dropout\u prob=tf.placeholder(tf.float32,name='dropout\u prob') #模式占位符 mode\u placeholder=tf.placeholder(tf.bool,name=“mode\u placeholder”) he_init=tf.contrib.layers.

我正在尝试使用批处理规范化,我的代码如下所示:

def create_conv_exp_model(指纹输入、模型设置、is_培训):
#辍学占位符
如果是大学培训:
dropout\u prob=tf.placeholder(tf.float32,name='dropout\u prob')
#模式占位符
mode\u placeholder=tf.placeholder(tf.bool,name=“mode\u placeholder”)
he_init=tf.contrib.layers.variance\u scaling\u初始值设定项(mode=“FAN\u AVG”)
#输入层
输入频率大小=模型设置['bins']
输入\时间\大小=模型\设置['光谱图\长度']
net=tf.重塑(指纹输入,
[-1,输入时间大小,输入频率大小,1],
name=“重塑”)
net=tf.layers.batch_归一化(net,
培训=模式\占位符,
name='bn_0')
对于范围(1,6)内的i:
net=tf.layers.conv2d(输入=net,
过滤器=8*(2**i),
内核大小=[5,5],
“相同”,
kernel\u initializer=he\u init,
name=“conv\ud%d”%i)
net=tf.layers.batch_归一化(net,
培训=模式\占位符,
name='bn\%d'%i)
使用tf.name\u作用域(“relu\ud%i”):
净=tf.nn.relu(净)
net=tf.layers.max_poolig2d(net,[2,2],[2,2],“相同”,
name=“maxpool\uu%d”%i)
net_shape=net.get_shape().as_list()
净高度=净形状[1]
净宽度=净形状[2]
net=tf.layers.conv2d(输入=net,
过滤器=1024,
内核大小=[净高,净宽],
步幅=(净高、净宽),
“相同”,
kernel\u initializer=he\u init,
name=“conv_f”)
net=tf.layers.batch_归一化(net,
培训=模式\占位符,
name='bn\u f')
使用tf.name_scope(“relu_f”):
净=tf.nn.relu(净)
net=tf.layers.conv2d(输入=net,
过滤器=型号设置[“标签计数”],
内核大小=[1,1],
“相同”,
kernel\u initializer=he\u init,
name=“conv_l”)
###挤
挤压=挤压(净,轴=[1,2],name=“挤压”)
如果是大学培训:
返回压缩、退出问题、模式占位符
其他:
返回压缩,模式\占位符
我的火车踏板是这样的:

update\u ops=tf.get\u集合(tf.GraphKeys.update\u ops)
使用tf.control\u依赖项(更新操作):
优化器=tf.train.AdamOptimizer(学习率=学习率输入)
gvs=优化器。计算梯度(交叉熵平均值)
capped_gvs=[(tf.clip_by_值(grad,-2,2.),var)表示梯度,gvs中的var]
训练步骤=优化器。应用梯度(gvs))
在培训期间,我向图表提供以下信息:

train\u summary,train\u精度,cross\u熵值,\uu,\uu=sess.run(
[
合并汇总、评估步骤、交叉熵平均值、训练步骤、,
增量\全局\步
],
饮食={
指纹输入:训练指纹,
地面真相输入:训练地面真相,
学习率输入:学习率值,
辍学概率:0.5,
模式_占位符:True
})
在验证过程中

validation\u摘要,validation\u准确性,conf\u matrix=sess.run(
[合并摘要、评估步骤、混淆矩阵],
饮食={
指纹输入:验证指纹,
地面实况输入:验证地面实况,
辍学概率:1.0,
模式_占位符:False
})
我的损失和准确度曲线(橙色表示训练,蓝色表示验证): ,


验证损失(和准确性)似乎非常不稳定。我的批处理规范化实现是否错误?或者这在批处理规范化中是正常的,我应该等待更多的迭代吗?

您需要将is_训练传递给
tf.layers.Batch_规范化(…,training=is_training)
或者它尝试使用小批量统计信息而不是训练统计信息来规范化推理小批量,这是错误的。

主要有两件事需要检查

1。您确定在训练操作中正确使用了批量标准化(BN)吗?

如果阅读图层文档:

注:培训时,需要更新移动平均值和移动方差。 默认情况下,更新操作放置在
tf.GraphKeys.update\u ops
中,因此 需要作为依赖项添加到
训练操作中。另外,一定要添加
获取更新操作集合之前的任何批处理操作。
否则,update_ops将为空,并且培训/推理将不起作用
对

例如:

x_norm = tf.layers.batch_normalization(x, training=training)

# ...
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
     train_op = optimizer.minimize(loss)
2。否则,尝试降低BN中的“动量”。

事实上,在训练过程中,BN使用了平均值和方差的两个移动平均值,这两个移动平均值被认为是人口统计的近似值。均值和方差分别初始化为0和1,然后逐步乘以动量值(默认值为0.99)并添加新值*0.01。在推断(测试)时,规范化使用这些统计信息。因此,这些值需要一段时间才能得到数据的“真实”均值和方差

资料来源:

原始BN文件可在此处找到:


我还观察到,在ReLU之前添加批次标准时,验证损失出现振荡。我们发现