问题标签 [batchnorm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1214 浏览

keras - Tensorflow 2.0 Keras BatchNorm:如何更新自定义训练中的在线参数?

如何在不使用任何 keras.compile 方法的情况下训练批处理规范层?通常,层具有可访问的损失。这里的 loss 方法是空的。

更新:

似乎对此有很多困惑,甚至 BatchNorm 的实现方式也很混乱。

首先,只有训练在线参数(在 training=False 模式下使用)来缩放和移动特征:在 training=True 模式下调用层。而且,如果您从不想使用批处理规范化的“批处理”部分(即,您只想要一个在线规范化器以正常对数概率损失进行自我训练,那么您基本上不能在一次调用 AFAIK 中做到这一点。

使用 training=False 调用层不会更新参数。用 training=True 调用它会更新参数,但随后你会得到批量标准化层(不使用在线 loc 和 scale)。

更新:

显示 keras 层有时会有损失(当子任务存在时,如规则化):

0 投票
1 回答
1065 浏览

keras - 理解 keras.layers.BatchNormalization 计算

我正在使用BatchNormalization层,但我无法弄清楚我得到的数值结果。

让我们考虑一下我们将 BatchNormalization 用于计算机视觉。

我们有 4D 张量。

维度是:批量大小图像高度图像宽度通道

如果我理解正确,BatchNormalization 会做的是:

  1. 训练时:
    • 对于每个批次,计算平均MU和标准偏差SIGMA。这是按通道完成的,并且跨越批次的所有图像的所有行和所有列。
    • 在所有批次中保持MU(例如)和SIGMA(例如SIĜMA )的指数移动平均值
    • 使用SIĜMA归一化像素:normalized_pixel = ((input_pixel - MÛ) / sqrt(SIĜMA))
    • 如果SIĜMA在训练期间的某一时刻变为空,则将超参数epsilon添加到SIĜMA以防止除以零: normalized_pixel = ((input_pixel - MÛ) / sqrt(SIĜMA + epsilon))
    • 使用缩放参数GAMMA和偏移参数BETA重新缩放归一化像素:output_pixel = ((GAMMA x normalized_pixel) + BETA)
    • GAMMABETA是可训练的参数,它们在训练期间进行了优化
  2. 在推理时:
    • SIĜMA现在是固定参数,就像GAMMABETA
    • 相同的计算适用

现在,我的问题来了……

首先,我只对推理时发生的事情感兴趣。我不关心训练,我认为SIĜMAGAMMABETA是固定参数。

我写了一段 python 来测试(1, 3, 4, 1)张量上的 BatchNormalization。由于只有一个通道,因此 MÛSIĜMAGAMMABETA各只有 1 个元素。

我选择了MÛ = 0.0SIĜMA = 1.0GAMMA = 1.0BETA = 0.0,所以 BatchNormalization 没有效果。

这是代码:

当我((((input_batch - MU) / math.sqrt(SIGMA)) * GAMMA) + BETA)使用 numpy 明确编写计算时,我得到了预期的结果。

但是,当我使用 keras.layers.BatchNormalization 层执行计算时,我得到了类似的结果,只是存在某种舍入误差或不精确:

当我使用 MU*、SIGMA*、GAMMA 和 BETA 的值时,输出会受到预期的影响,所以我相信我正确地向层提供了参数。

我还尝试将图层的超参数 epsilon 设置为 0.0。它会稍微改变结果,但不能解决问题。

有人可以解释发生了什么吗?

谢谢,

朱利安

0 投票
1 回答
90 浏览

c++ - BatchNormalization 层构建

我正在尝试在 C++ 中设置 BatchNormalization 层。

我拥有的代码如下所示:

简而言之,制作 gamma、beta、movingMean 和 MovingVariance,并使用这些符号制作 BatchNorm。

但。BatchNorm 层正在输出零。这让我觉得我需要做点别的。

谁能给我一些线索来构建具有先前训练的权重的 BatchNorm 层?

0 投票
1 回答
2603 浏览

machine-learning - Batchnorm2d Pytorch - 为什么将通道数传递给 batchnorm?

为什么我需要将之前的通道数传递给 batchnorm?batchnorm 应该对批处理中的每个数据点进行归一化,为什么它需要有通道数呢?

0 投票
1 回答
491 浏览

python - pytorch CNN 模型中的 BatchNorm2d 错误

我的数据库有大小为 128 * 128* 1 的灰度图像,每个批次大小 =10 我正在使用 cnn 模型,但我在 BatchNorm2d
预期的 4D 输入(获得 2D 输入)中收到此错误

我发布了我用来转换图像的方式(灰度 - 张量 - 归一化)并将其分成批次

我用了这个模型

我怎么解决这个问题 ?

0 投票
1 回答
469 浏览

python - 从pytorch导出batchnorm权重到Keras的问题

我遵循不同于 Keras Batchnorm 的 Pytorch Batchnorm 层Pytorch Batchnorm implementation,但它们并没有解决我的问题。

我还阅读了有关 Batchnorm 的 Wiki。并从tensorflow batchnorm和pytorch 源代码中搜索源代码

下面是我的测试代码,pytorch 和 keras 之间的结果在 1e-2 到 1e-3 的错误顺序上是不同的,这是很大的。函数 b0, b1 类似于 torch 结果,但仍然不太准确。b2 尝试遵循tensorflow batchnorm中使用的公式。

卷积部分产生相同的结果,但我停留在 batchnorm 层。我还将 eval()、no_grad() 用于 pytorch,将 model.predict 用于 keras 模型,以确保它们处于推理阶段。

TensorFlow 实现不使用 1/sqrt(var+eps),而是使用 sqrt(var+eps)。我尝试将 1/running_var 转移到 keras.BN.movi​​ng_var 但结果仍然失败。

0 投票
1 回答
209 浏览

python - Pytorch中model.train()和model.eval()模式下BatchNorm层反向传播的区别?

我为两种模式测试 BatchNorm 层的梯度:model.train() 和 model.eval()。我构建了一个简单的 CNN 网络NetWork,并在 model.train() 模式和 model.eval() 模式下将相同的输入 X 输入到网络。我知道 BatchNorm 层的 model.train() 和 model.eval() 的区别。我已将 model.eval() 模式中 Batchnorm 层的均值和 var 替换为 model.train() 模式中的值。因此,两种模式的输出和参数都是相同的。 两个模式的两个模式参数的输出 然而,当我计算每个参数的梯度时,我发现BatchNorm层之前的层的梯度是不同的,尽管它们的参数和损失是相同的。 BatchNorm 之前层的不同梯度 我认为这是因为 model.train() 和 model.eval() 的 BatchNorm 层反向传播的差异,但我不了解它的细节。有人知道吗?太感谢了。

0 投票
0 回答
26 浏览

tensorflow - 如何在使用 tensorflow 版本 1 时在激活前后应用批量标准化

实际上,我在我的网络中使用了 batchnorm,例如:

但我不知道它是否适用于激活之前或之后。我似乎在追求,但我不确定。

在网站上:https ://www.tensorflow.org/api_docs/python/tf/compat/v1/layers/batch_normalization 他们声明他们的参考文献是 Ioffe et al., 2015,在激活之前适用。但是,我想对它们进行试验并比较它们的结果。不幸的是,我在使用 tensorflow 1 时没有找到如何做到这一点。

任何人都可以帮助我吗?

0 投票
1 回答
49 浏览

pytorch - 使用 BatchNorm 的 Pytorch Gradient wrt 输入

我正在尝试计算一个简单神经网络的输出相对于输入的梯度。当我不使用 BatchNorm 图层时,结果看起来不错。一旦我使用它,结果似乎没有多大意义。下面是一个重现效果的简短示例。

可视化

当我使用评估模式时,结果似乎也很好。不幸的是,我不能只切换到 eval() 模式,因为我的问题(PINN)的性质需要在训练期间计算梯度。

我了解在训练期间会更新运行均值和方差。也许这有影响?我还能以某种方式获得正确的渐变吗?

谢谢你的帮助!

0 投票
0 回答
19 浏览

tensorflow - 有没有办法使用来自 TF 2.x keras batchnorm 层的图形 API 或图形结构来读取操作参数?

在 TF1.x 中,我们可以使用图结构/图 API 读取批量标准化层的参数,例如 epsilon、动量。如果不对定义为 tf.keras.layers.BatchNormalization()(inp) 和 tf.compat.v1.disable_eager_execution() 的层使用高级 keras API,我们如何在 TF 2.x 中实现相同的目标。