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

为什么当我在训练时间设置is_training=False时,Tensorflow BN层中的moving_mean和moving _variance会变成nan?

当在训练时间设置is_training=False时,TensorFlow中的Batch Normalization(BN)层的moving_mean和moving_variance会变成NaN的原因是由于在推理阶段(is_training=False)时,BN层不再进行统计信息的更新,而是使用之前训练阶段(is_training=True)中计算得到的moving_mean和moving_variance来进行归一化操作。

然而,当在训练阶段(is_training=True)时,如果输入的batch样本过小,可能会导致方差(variance)过小,进而使得标准差(standard deviation)接近于0。在BN层的归一化操作中,需要对标准差进行除法运算,而除以接近于0的标准差会导致除法结果趋近于无穷大,进而产生NaN值。

为了解决这个问题,可以通过以下几种方式进行处理:

  1. 增加batch样本的大小:通过增加训练时的batch_size,可以增加样本的数量,从而减小方差的值,避免出现除以接近于0的情况。
  2. 设置合适的epsilon值:在BN层的归一化操作中,会加上一个很小的常数epsilon,用于避免除以接近于0的情况。可以尝试调整epsilon的值,选择一个合适的值来避免NaN的产生。
  3. 检查网络结构和参数初始化:确保网络结构合理,并且参数初始化正确。不合理的网络结构或者错误的参数初始化可能导致BN层的统计信息出现异常,进而导致NaN的产生。

需要注意的是,以上解决方案是基于TensorFlow的BN层的常见问题和解决方法,具体情况还需要根据实际代码和环境进行分析和调试。

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

  • 腾讯云官网:https://cloud.tencent.com/
  • 腾讯云AI智能服务:https://cloud.tencent.com/product/ai
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/tbaas
  • 腾讯云视频处理服务:https://cloud.tencent.com/product/vod
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

tensorflow: bn decay参数项

实验: 探究 batch normalization 过程 decay 参数项 train test 过程不同作用。...结论: train 过程改变参数,而 test 过程不改变参数; test过程中直接沿用了train出来参数进行计算; decay参数项目虽然 train test 过程中都有,train过程...验证代码:    decay=0 (即移动偏移无损失): import tensorflow as tf def func(in_put, layer_name, is_training=True...output 可知,decay=1,经过train之后,’my/BatchNorm/moving_mean:0’ 变成了[ 114.78817749]、 ‘my/BatchNorm/moving_variance...结论: 1. decay参数项目虽然 train test 过程中都有,train过程,不对求解结果产生影响,只对求解结束参数项偏移程度产生影响。

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

    理论上,深层网络结构包含了浅层网络结构所有可能解空间,但是实际网络训练,随着网络深度增加,网络准确度出现饱和,甚至下降现象,这个现象可以在下图直观看出来:56网络比20网络效果还要差。...但是这种退化并不是因为过拟合导致,因为56神经网络训练误差同样高。 56神经网络20神经网络训练误差测试误差对比 这就是神经网络退化现象。...对于深度较深神经网络,BN必不可少,关于BN介绍实现可以参考以前文章。...Bottleneck Architectures 更深层(esNet-50/101/152)神经网络为了节省计算耗时, 作者对神经网络架构进行了改造,将原有的两3x3卷积改造为三卷积:1x1...(), trainable=False) moving_variance = create_var("moving_variance

    62220

    谈谈TensorflowBatch Normalization

    tensorflow关于BN(Batch Normalization)函数主要有两个,分别是: tf.nn.moments tf.nn.batch_normalization 关于这两个函数,官方API...2、计算卷积神经网络某meanvariance 假定我们需要计算数据形状是 [batchsize, height, width, kernels],熟悉CNN都知道,这个tensorflow...BN神经网络进行trainingtesting时候,所用mean、variance是不一样!这个博客里已经说明了,但具体怎么操作呢?...= control_flow_ops.cond(['is_training'], lambda: (mean, variance), lambda: (moving_mean, moving_variance...关于BN完整实现,Ryan Dahlrepository里有,名字叫做tensorflow-resnet(https://github.com/ry/tensorflow-resnet),可以自行查看

    1.3K70

    TensorFlow实现批量归一化操作示例

    产生梯度爆炸原因是因为网络内部协变量转移,即正向传播不同参数会将反向训练计算参照数据样本分布改变。...批量归一化定义 TensorFlow中有自带BN函数定义: tf.nn.batch_normalization(x, maen, variance...,一般设置0.9,值太小会导致更新太快,值太大会导致几乎没有衰减,容易出现过拟合。...is_training:当为True,代表训练过程,这时会不断更新样本集均值方差,当测试,要设置False,这样就会使用训练样本均值方差。...但它是每次当前批次训练完成后才更新均值方差,这样导致当前数据总是使用前一次均值方差,没有得到最新值,所以一般设置为None,让均值方差及时更新,但在性能上稍慢。

    1K20

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

    slim.batch_norm里有moving_meanmoving_variance两个量,分别表示每个批次均值方差。...当training时候,参数moving_meanmoving_variance都需要update。...看官网教程解释用法: Note: when training, the moving_mean and moving_variance need to be updated...., 注意到我们使用了`batch_norm`,需要更新每一`average``variance`参数, # 更新过程不包含在正常训练过程, 需要我们去手动像下面这样更新..., 注意到我们使用了`batch_norm`,需要更新每一`average``variance`参数, # 更新过程不包含在正常训练过程, 需要我们去手动像下面这样更新

    1.1K30

    从零开始学Pytorch(九)之批量归一化残差网络

    1.对全连接做批量归一化 位置:全连接仿射变换激活函数之间。...3.预测时批量归⼀化 训练:以batch为单位,对每个batch计算均值方差。 预测:用移动平均估算整个训练数据集样本均值方差。..., X, gamma, beta, moving_mean, moving_var, eps, momentum): # 判断当前模式是训练模式还是预测模式 if not is_training...: # 如果是预测模式下,直接使用传入移动平均所得均值方差 X_hat = (X - moving_mean) / torch.sqrt(moving_var +...残差块(Residual Block) 恒等映射: 左边:f(x)=x 右边:f(x)-x=0 (易于捕捉恒等映射细微波动) Image Name 残差块,输⼊可通过跨数据线路更快 地向前传播

    88820

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

    to the batch normalization layer. 1.函数声明添加'is_training'参数,以确保可以向Batch Normalization传递信息 2.去除函数bias...偏置属性激活函数 3.添加gamma, beta, pop_mean, and pop_variance等变量 4.使用tf.cond函数来解决训练预测时使用方法差异 5.训练,我们使用tf.nn.moments......语句结构块来强迫Tensorflow先更新均值方差分布,再使用执行批标准化操作 6.在前向传播推导(特指只进行预测,而不对训练参数进行更新),我们使用tf.nn.batch_normalization...批标准化时其中均值方差分布来自于训练我们 使用滑动平均算法估计值。...但是我们运行,注意到它似乎并没有学习到前250个批次任何东西,然后精度开始上升。 这只是显示——即使是批处理标准化,给您网络一些时间来学习是很重要

    2K50

    DeepLab v3_deeplab模型导出

    网络结构bottleneck上参数设置,与checkpoint训练网络结构不一样。同时,resnet论文中提及时候,作者说自己改过了。.../BatchNorm/moving_mean] WARNING:tensorflow:Checkpoint is missing variable [image_pooling/BatchNorm/moving_variance...,再用voc2012 trainaug set预训练,得到权重才可以论文比。...所以武汉肺炎终究过去。就是医护人员湖北人手不足,新闻上全家感染例子不在少数。致死率没有非典严重,大多数是并发症。但是传染速度真的是太快了。虽然不能恐慌,但是也要严肃对待。...这里贴是resnet101voc结果, 这个贴是xception,可以看到,这里采用了coco以及JFT两个数据集预训练作为变量。

    27630

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

    false测试结果很差,设置成true测试结果恢复正常 训练结果很好,但是测试结果要差上不少 但是tensorflow官方提供常见网络代码以及与训练模型都是基于slim模块建立,使用者可以直接fine-tune...测试时候给成True,测试给为false,此参数控制网络batchnorm使用,设置为true,batchnormbetagama参与训练进行更新,设置false时候不更新,而是使用计算好...moving mean moving variance,关于batchnorm相关问题可以参考我博文,因此,is_training 测试时候给成True,也就是测试集上仍然更新batchnorm...问题原因是测试时候没有利用到moving mean moving variance,解决方案就是更新train op时候同时更新batchnormop,即是代码做如下更改: update_ops...其中最重要一个参数就是'decay': batch_norm_decay,原始代码是image net上训练,decay设置是0.999,这个数值越大,网络训练越平缓,相对需要更多训练时间

    2.4K20

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

    论文BN2015,IoffeSzegedy指出批标准化不仅能应用更高学习率、具有正则化器效用,还能将训练速度提升14倍之多。本文将基于TensorFlow来实现批标准化。...基于TensorFlow实现批标准化 我们将把批标准化加进一个有两个隐藏、每层包含100个神经元全连接神经网络,并展示与论文BN2015图1(b)(c)类似的实验结果。...激活函数输入时间序列图示 下面是网络第2前5个神经元sigmoid激活函数输入随时间分布情况。批标准化消除输入方差/噪声上具有显著效果。...和我们需要批标准化原因一样(激活输入均值方差训练时会发生变化),估算全局均值方差最好在其依赖权重更新完成后,但是同时进行也不算特别糟,因为权重在训练快结束就收敛了。...注意,我们不仅要在训练做一次构建,测试还要重新做一次构建,所以我们写了一个build_graph函数(实际模型对象往往也是这么封装): def build_graph(is_training)

    1.1K80

    BN代码实现_无代码

    Batch Normalization 开发环境 项目代码结构 生成虚拟数据程序 神经网络构建 带初始化模型神经网络构建 带BNFC网络不带BNFC网络对比 不同初始化方式带BN网络模型对比...pillow 项目代码结构 src文件夹存储了带有BNFC训练文件、基于初始化BNFC训练文件以及BN训练阶段操作。...FC网络不带BNFC网络对比 import torch import torch.utils.data as Data import matplotlib.pyplot as plt import...) layer_inputs.append(layer_input) pre_acts.append(pre_act) net.train() # free moving_mean and moving_var...原理及代码 训练阶段:均值标准差通过指数滑动平均统计得来, γ \gamma γ β \beta β通过梯度反向传播不断更新 测试阶段:均值标准差是固定, γ \gamma γ β \beta

    1.2K20

    【译】TensorFlow实现Batch Normalization

    论文BN2015,IoffeSzegedy指出批标准化不仅能应用更高学习率、具有正则化器效用,还能将训练速度提升14倍之多。本文将基于TensorFlow来实现批标准化。...基于TensorFlow实现批标准化 我们将把批标准化加进一个有两个隐藏、每层包含100个神经元全连接神经网络,并展示与论文BN2015图1(b)(c)类似的实验结果。...激活函数输入时间序列图示 下面是网络第2前5个神经元sigmoid激活函数输入随时间分布情况。批标准化消除输入方差/噪声上具有显著效果。...和我们需要批标准化原因一样(激活输入均值方差训练时会发生变化),估算全局均值方差最好在其依赖权重更新完成后,但是同时进行也不算特别糟,因为权重在训练快结束就收敛了。...注意,我们不仅要在训练做一次构建,测试还要重新做一次构建,所以我们写了一个build_graph函数(实际模型对象往往也是这么封装): def build_graph(is_training)

    1.8K60

    Operators in MXNet-BatchNorm

    因此, 训练过程除了正常前向传播反向求导 之外, 我们还要记录每一个Batch均值方差, 以便训练完成之后按计算整体均值方差....由于train-set数据量非常大, 计算mean计算量非常大, 所以经常采用技术是使用moving average算法, 在为此训练过程需要记录 每一个Batch均值方差, 以便训练完成之后按照下式计算整体均值方差...test/predict阶段, 或者是use_global_stats == true(这两者其实可以看成是一种情况, 训练阶段, use_global_stats == false 否则网络是不收敛...测试前向传播过程, 利用 moving_meanmoving_var来代替整个测试集均值方差....测试阶段使用use global statistics, 损失关于BN参数gamma梯度训练阶段类似的, 只是var用moving_var代替. */ } else { // 固定了

    38810

    手把手教你如何用飞桨自动生成二次元人物头像

    elu与leakyrelu相比效果并不明显,这里改用计算复杂度更低leakyrelu 判别网络(D)增加Dropout,并将dropout_prob设置为0.4,避免过拟合梯度消失/爆炸问题...改进后,网络收敛速度明显加快,原项目训练时间需要300个epoch,训练超过10小,改进后仅需要90个epoch,训练时间3个小时左右,同时生成动漫头像在细节上层次更加丰富,生成动漫头像风格更加多样...# 指定偏置属性对象 moving_mean_name=name + '3', # moving_mean名称 moving_variance_name...=name + '_bn_3', # moving_mean名称 moving_variance_name=name + '_bn_4', # moving_variance...判别网络 将BatchNorm批归一化momentum参数设置为0.5 将判别网络(D)激活函数由elu改为leaky_relu,并将alpha参数设置为0.2 判别器(D)增加Dropout

    77710

    送你5个MindSpore算子使用经验

    Batch里meanvariance值,即moving_meanmoving_variance, 借鉴优化算法里Momentum算法将历史Batch里meanvariance作用延续到当前...经验总结: MindSporeBatchNorm1d、BatchNorm2dmomentum参数(定义该参数变量名称为momentum_ms),该参数与PyTorch里BNmomentum参数(...参数是用来设置节点值为0概率 经验总结: MindSporedropoutkeep_prob参数,该参数与PyTorch里dropoutp参数关系为: keep_prob=1−p 使用mindspore.nn.SmoothL1Loss...注意问题 在网络训练,一般会把Loss结果对Batch Size求平均;PyTorchLoss算子一般会有是否求平均参数,而MindSpore里面的Loss算子没有这个参数。...mindspore.nn.Dropout dropout算子只训练中使用,测试时候需要去掉。

    32110

    面部表情还是面目表情(怎样调整面部表情)

    dropout影响: 各种滑动平均,包括BN,保存与使用: BN问题最多: 关于tfrecord数据类型问题: TFRecord: restore模型遇到问题: 测试准确率内存溢出: 训练一半改学习率会发生什么...clip弊端,强行限制数值传递,可能影响网络训练(举例,a=100被砍成a=1,a=1target=1loss是0,则a=100永远不能变成a=1)。...其他都好说,但是有一个错误是没有预防机制,就是不更新滑动平均,一定要记得更新滑动平均!! 预测时候,一定要把BNtraining项改回False,如果保持同样网络设置,就不对了。...每个BN包括四个变量,所有数据滑动平均meanvariance,经过meanvariance处理后,缩放系数gamma和平移系数beta,他们未经训练时候应该是刚好让数据保持不变,训练之后效果是让不同输入对应输出都在一个相同分布...EMA更新了moving_meanmoving_variance 但是使用非训练模式BN,结果总是不太满意,不知道是训练不充足还是什么其他原因,更新是肯定更新了,被EMA给更新了,受dropout

    1.7K40

    ICCV2019 高通Data-Free Quantization论文解读

    一些概念 通常我们用各种现有成熟深度学习框架,如TensorFlow、Pytorch或mxnet等搭建网络模型,参数中间运行数据都是默认为float32类型,然而在移动嵌入式设备上,由于内存大小...方法具有普适性,适合所有模型,但是需要额外数据用于校正batch normalization统计参数如moving meanmoving variance,或者用来逐地计算量化误差,并且根据该误差采取相应策略...这种特定模型指的是用全浮点训练收敛之后模型进行量化效果极差,并且必须从头开始加上量化操作进行训练,这种方法需要消耗极大时间成本。 回到这篇DFQ论文,我们分析一下他要解决问题作出贡献 3....0,导致精度下降,per-channel方法可以解决这个问题,但是硬件实现上因为要针对每一个通道都有自己独立缩放系数偏移值考虑,导致很多额外开销,得不偿失; ?...,且一些情况下还需要一些调参技巧,如BN操作moving_meanmoving_variance要重新校正还是直接冻结等,且一些深度学习框架上提供模型压缩与量化工具也是更倾向于一键直接离线量化

    1.2K30
    领券