首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Tensorflow batch_norm在测试时不能正常工作(is_training=False)

TensorFlow中的batch normalization(批归一化)是一种用于加速深度神经网络训练的技术。它通过对每个小批量输入进行归一化,使得网络的输入分布更加稳定,有助于提高训练速度和模型的泛化能力。

在TensorFlow中,batch normalization层通常包含两个阶段:训练阶段和测试阶段。在训练阶段(is_training=True),batch normalization会计算每个小批量输入的均值和方差,并使用这些统计量对输入进行归一化。此外,它还会维护一个移动平均的均值和方差,用于在测试阶段(is_training=False)对输入进行归一化。

然而,有时候在测试阶段,当is_training=False时,TensorFlow的batch normalization层可能无法正常工作的原因可能有以下几种:

  1. 未正确设置更新操作:在训练阶段,batch normalization层会通过更新操作来更新移动平均的均值和方差。在测试阶段,如果没有正确设置更新操作,那么移动平均的均值和方差将不会更新,导致归一化不准确。解决方法是在测试阶段使用tf.contrib.layers.batch_norm函数,并设置参数is_training=Falseupdates_collections=None
  2. 未正确保存和恢复移动平均的均值和方差:在训练阶段,batch normalization层会将移动平均的均值和方差保存到模型的变量中。在测试阶段,如果没有正确恢复这些变量,那么归一化将使用错误的均值和方差。解决方法是使用tf.train.ExponentialMovingAverage类来保存和恢复移动平均的均值和方差。
  3. 数据分布不一致:在训练阶段,batch normalization层会根据每个小批量输入的均值和方差进行归一化。在测试阶段,如果测试数据的分布与训练数据的分布不一致,那么归一化可能不准确。解决方法是在测试阶段使用训练数据的移动平均的均值和方差进行归一化,或者使用批量归一化的训练数据的统计量来进行归一化。

总结起来,要解决TensorFlow中batch normalization在测试时不能正常工作的问题,可以采取以下步骤:

  1. 在测试阶段使用tf.contrib.layers.batch_norm函数,并设置参数is_training=Falseupdates_collections=None
  2. 使用tf.train.ExponentialMovingAverage类来保存和恢复移动平均的均值和方差。
  3. 确保测试数据的分布与训练数据的分布一致,或者使用训练数据的移动平均的均值和方差进行归一化。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云机器学习平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 腾讯云弹性计算(云服务器):https://cloud.tencent.com/product/cvm
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能开放平台(AI):https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 你必须要知道CNN模型:ResNet

    实验发现深度网络出现了退化问题(Degradation problem):网络深度增加,网络准确度出现饱和,甚至出现下降。这个现象可以图3中直观看出来:56层的网络比20层网络效果还要差。...当残差为0,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层输入特征基础上学习到新的特征,从而拥有更好的性能。残差学习的结构如图4所示。...对于短路连接,当输入和输出维度一致,可以直接将输入加到输出上。但是当维度不一致(对应的是维度增加一倍),这就不能直接相加。...图8 改进后的残差单元及效果 PART 05 ResNet的TensorFlow实现 这里给出ResNet50的TensorFlow实现,模型的实现参考了Caffe版本的实现(https://github.com...=1, scope="conv_2") h = batch_norm(h, is_training=is_training, scope="bn_2") h = tf.nn.relu

    2.1K81

    深度残差网络(ResNet)论文学习(附代码实现)

    56层神经网络和20层神经网络训练误差和测试误差对比 这就是神经网络的退化现象。何博士提出的残差学习的方法解决了解决了神经网络的退化问题,深度学习领域取得了巨大的成功。...每个Block的第一个子Block的第一个卷积层的stride=2,完成Feature Map的下采样的工作。...stride=1, scope="conv_2") h = batch_norm(h, is_training=is_training, scope="bn_2") h...= tf.nn.relu(h) h = conv2d(h, n_out, 1, stride=1, scope="conv_3") h = batch_norm(h, is_training...并在实验中构造三种shortcut的方式: A) 当数据维度增加,采用zero padding进行数据填充; B) 当数据维度增加,采用projection的方式;数据维度不变化时,直接使用恒等映射

    63620

    使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)「建议收藏」

    的占位符节点,由placeholder方法创建,其也是一种常量,但是由用户调用run方法传递的,可以简单理解为形参,用于定义过程,执行的时候再赋具体的值。...利用tf.placeholder(),代码就可以很方便的实现:is_training=True,填充train数据进行训练过程,is_training=False,填充val数据进行验证过程 # 定义...由于inception_v3使用了batch_norm层,需要更新每一层的`average`和`variance`参数, 更新的过程不包含在正常的训练过程中, 需要我们去手动更新,并通过`tf.get_collection..., 注意到我们使用了`batch_norm`层,需要更新每一层的`average`和`variance`参数, # 更新的过程不包含在正常的训练过程中, 需要我们去手动像下面这样更新..., 注意到我们使用了`batch_norm`层,需要更新每一层的`average`和`variance`参数, # 更新的过程不包含在正常的训练过程中, 需要我们去手动像下面这样更新

    1.1K30

    黑猿大叔-译文 | TensorFlow实现Batch Normalization

    但是这会造成,上面的模型想正确的工作,就只能一次性的将测试集所有样本进行预测,因为这样才能算出理想的全局均值和全局方差。...为了使批标准化模型适用于测试,我们需要在测试前的每一步批标准化操作,都对全局均值和全局方差进行估算,然后才能在做预测时使用这些值。...训练期间,一个计算全局均值和方差的方法是指数平滑法,它很简单,且避免了额外的工作,我们应用如下: decay = 0.999 # use numbers closer to 1 if you have...现在为了证明修复后的代码可以正常测试,我们使用batch_norm_wrapper重新构建模型。...注意,我们不仅要在训练做一次构建,测试还要重新做一次构建,所以我们写了一个build_graph函数(实际的模型对象往往也是这么封装的): def build_graph(is_training)

    1.1K80

    【译】TensorFlow实现Batch Normalization

    但是这会造成,上面的模型想正确的工作,就只能一次性的将测试集所有样本进行预测,因为这样才能算出理想的全局均值和全局方差。...为了使批标准化模型适用于测试,我们需要在测试前的每一步批标准化操作,都对全局均值和全局方差进行估算,然后才能在做预测时使用这些值。...训练期间,一个计算全局均值和方差的方法是指数平滑法,它很简单,且避免了额外的工作,我们应用如下: decay = 0.999 # use numbers closer to 1 if you have...现在为了证明修复后的代码可以正常测试,我们使用batch_norm_wrapper重新构建模型。...注意,我们不仅要在训练做一次构建,测试还要重新做一次构建,所以我们写了一个build_graph函数(实际的模型对象往往也是这么封装的): def build_graph(is_training)

    1.8K60

    Tensorflow BN详解:4_使用tf.nn.batch_normalization实现BN

    为了增加批量标准化,我们做了如下工作: Added the is_training parameter to the function signature so we can pass that information...to the batch normalization layer. 1.函数声明中添加'is_training'参数,以确保可以向Batch Normalization层中传递信息 2.去除函数中bias......语句结构块来强迫Tensorflow先更新均值和方差的分布,再使用执行批标准化操作 6.在前向传播推导(特指只进行预测,而不对训练参数进行更新),我们使用tf.nn.batch_normalization...每次调用sess.run函数,我们都添加到feed_dict中is_training的适当值用以表示当前是正在训练还是预测 3.We did not need to add the with tf.control_dependencies...) # At the end, score the final accuracy for both the validation and test sets # 最后验证集和测试集上对模型准确率进行评分

    2K50

    使用tensorflow 的slim模块fine-tune resnetdensenetinception网络,解决batchnorm问题

    false测试结果很差,设置成true测试结果恢复正常 训练结果很好,但是测试的结果要差上不少 但是tensorflow官方提供的常见的网络代码以及与训练模型都是基于slim模块建立的,使用者可以直接fine-tune...每个网络都有对应的代码和预训练的模型,可以直接拿来fine-tune 坑1: 对于问题:训练结果很好,测试的时候istrainingistrainingis_training设置成false测试结果很差...,设置成true测试结果恢复正常。...测试的时候给成True,测试给为false,此参数控制网络batchnorm的使用,设置为true,batchnorm中的beta和gama参与训练进行更新,设置成false的时候不更新,而是使用计算好的...moving mean 和moving variance,关于batchnorm相关问题可以参考我的博文,因此,is_training 测试的时候给成True,也就是测试集上仍然更新batchnorm

    2.4K20

    Tensorflow BatchNormalization详解:3_使用tf.layers高级函数来构建带有BN的神经网络

    return conv_layer """ 为了修改训练函数,我们需要做以下工作: 1.Added is_training, a placeholder to store a boolean value...the appropriate value for is_training 每次调用sess.run函数,我们都添加到feed_dict中is_training的适当值用以表示当前是正在训练还是预测...to update the population statistics while training # 通知Tensorflow训练要更新均值和方差的分布 with tf.control_dependencies...) # At the end, score the final accuracy for both the validation and test sets # 最后验证集和测试集上对模型准确率进行评分...具体地说,这意味着你要么训练没有计算总体均值和方差,要么推理过程中没有使用这些值。

    1.9K20

    解析Tensorflow官方PTB模型的demo

    Tensorflow的官方教程中,有两个与之相关的模型被实现出来。...第一个模型是围绕着Zaremba的论文Recurrent Neural Network Regularization,以Tensorflow框架为载体进行的实验再现工作。...=False, config=config) mtest = PTBModel(is_training=False, config=eval_config) tf.initialize_all_variables...训练新的模型将会非常不妥,所以我们需要运用之前训练好的模型的参数来测试他们的效果,故定义reuse=True。这个概念有需要的朋友可以参考Tensorflow的官方文件对共享变量的描述。...这里简便的放入了最后结果,我们可见,13个epoch,我们的测试perplexity为117.605, 对应了论文里non-regularized LSTM的114.5,运行时间约5到6小

    1.3K80

    如何对机器学习代码进行单元测试

    写这段代码,只是复制、粘贴了 slim.conv2d(…) 这行,修改了核(kernel)大小,忘记修改实际的输入。 这个实际上是作者一周前刚刚碰到的状况,很尴尬,但是也是重要的一个教训!... tensorflow 中,batch_normis_training 默认值是 False,所以训练过程中添加这行代码,会导致输入无法标准化!...像生成式对抗网络这样高级的结构中,这意味着遥遥无期的训练时间。然而只需要一个简单测试,就可以检查到这种错误: 也可以对判定模型(discriminator)写一个同类型的测试。...如果发现一个诡异的失败测试,但是却再也无法重现,将会是很糟糕的事情。特别需要随机输入的场景下,确保用了同一个随机数种子。这样出现了失败后,可以再次以同样的输入重现它。 确保测试很精简。...不要用同一个单元测试检查回归训练和检查一个验证集合。这样做只是浪费时间。 确保每次测试都重置了图。 作为总结,这些黑盒算法仍然有大量方法来测试

    2.5K100

    使用神经网络的自动化特征工程

    虽然我的解决方案并没有完全消除对手工工作的需要,但它确实大大减少了手工工作,并产生了更好的结果。它还生成了一个结构化数据集上始终优于梯度增强方法的模型。 本文将包含以下内容: 到底什么被自动化了?...当向模型提供一组特征,它必须了解哪些特征相互作用,以及它们是如何相互作用的。有了庞大的数据集,可以有无数的组合进行测试,这些模型往往专注于提供快速成功的交互。...创建TensorFlow数据集,我们还必须将它们定义为输出特征。请注意,我们通过末尾添加“ _out”来重命名每个特征,以免TensorFlow被重复的名称弄糊涂。...这个 输入可以使用hyperopt求解最佳参数(test = True)或训练并返回最终模型(test = False)之间进行切换。编译模型,也可能不调整loss_weights参数。...因为我们有多个辅助输出,所以我们需要告诉TensorFlow确定如何调整模型以提高准确性给每个加权多少。我个人喜欢对辅助预测(总计)给予50%的权重,对目标预测给予50%的权重。

    88020
    领券