问题标签 [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.
keras - Tensorflow 2.0 Keras BatchNorm:如何更新自定义训练中的在线参数?
如何在不使用任何 keras.compile 方法的情况下训练批处理规范层?通常,层具有可访问的损失。这里的 loss 方法是空的。
更新:
似乎对此有很多困惑,甚至 BatchNorm 的实现方式也很混乱。
首先,只有训练在线参数(在 training=False 模式下使用)来缩放和移动特征:在 training=True 模式下调用层。而且,如果您从不想使用批处理规范化的“批处理”部分(即,您只想要一个在线规范化器以正常对数概率损失进行自我训练,那么您基本上不能在一次调用 AFAIK 中做到这一点。
使用 training=False 调用层不会更新参数。用 training=True 调用它会更新参数,但随后你会得到批量标准化层(不使用在线 loc 和 scale)。
更新:
显示 keras 层有时会有损失(当子任务存在时,如规则化):
keras - 理解 keras.layers.BatchNormalization 计算
我正在使用BatchNormalization层,但我无法弄清楚我得到的数值结果。
让我们考虑一下我们将 BatchNormalization 用于计算机视觉。
我们有 4D 张量。
维度是:批量大小、图像高度、图像宽度、通道。
如果我理解正确,BatchNormalization 会做的是:
- 训练时:
- 对于每个批次,计算平均MU和标准偏差SIGMA。这是按通道完成的,并且跨越批次的所有图像的所有行和所有列。
- 在所有批次中保持MU(例如MÛ)和SIGMA(例如SIĜMA )的指数移动平均值
- 使用MÛ和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)
- GAMMA和BETA是可训练的参数,它们在训练期间进行了优化
- 在推理时:
- MÛ和SIĜMA现在是固定参数,就像GAMMA和BETA
- 相同的计算适用
现在,我的问题来了……
首先,我只对推理时发生的事情感兴趣。我不关心训练,我认为MÛ、SIĜMA、GAMMA和BETA是固定参数。
我写了一段 python 来测试(1, 3, 4, 1)张量上的 BatchNormalization。由于只有一个通道,因此 MÛ、SIĜMA、GAMMA和BETA各只有 1 个元素。
我选择了MÛ = 0.0,SIĜMA = 1.0,GAMMA = 1.0和BETA = 0.0,所以 BatchNormalization 没有效果。
这是代码:
当我((((input_batch - MU) / math.sqrt(SIGMA)) * GAMMA) + BETA)
使用 numpy 明确编写计算时,我得到了预期的结果。
但是,当我使用 keras.layers.BatchNormalization 层执行计算时,我得到了类似的结果,只是存在某种舍入误差或不精确:
当我使用 MU*、SIGMA*、GAMMA 和 BETA 的值时,输出会受到预期的影响,所以我相信我正确地向层提供了参数。
我还尝试将图层的超参数 epsilon 设置为 0.0。它会稍微改变结果,但不能解决问题。
有人可以解释发生了什么吗?
谢谢,
朱利安
c++ - BatchNormalization 层构建
我正在尝试在 C++ 中设置 BatchNormalization 层。
我拥有的代码如下所示:
简而言之,制作 gamma、beta、movingMean 和 MovingVariance,并使用这些符号制作 BatchNorm。
但。BatchNorm 层正在输出零。这让我觉得我需要做点别的。
谁能给我一些线索来构建具有先前训练的权重的 BatchNorm 层?
machine-learning - Batchnorm2d Pytorch - 为什么将通道数传递给 batchnorm?
为什么我需要将之前的通道数传递给 batchnorm?batchnorm 应该对批处理中的每个数据点进行归一化,为什么它需要有通道数呢?
python - pytorch CNN 模型中的 BatchNorm2d 错误
我的数据库有大小为 128 * 128* 1 的灰度图像,每个批次大小 =10 我正在使用 cnn 模型,但我在 BatchNorm2d
预期的 4D 输入(获得 2D 输入)中收到此错误
我发布了我用来转换图像的方式(灰度 - 张量 - 归一化)并将其分成批次
我用了这个模型
我怎么解决这个问题 ?
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.moving_var 但结果仍然失败。
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 层反向传播的差异,但我不了解它的细节。有人知道吗?太感谢了。
tensorflow - 如何在使用 tensorflow 版本 1 时在激活前后应用批量标准化
实际上,我在我的网络中使用了 batchnorm,例如:
但我不知道它是否适用于激活之前或之后。我似乎在追求,但我不确定。
在网站上:https ://www.tensorflow.org/api_docs/python/tf/compat/v1/layers/batch_normalization 他们声明他们的参考文献是 Ioffe et al., 2015,在激活之前适用。但是,我想对它们进行试验并比较它们的结果。不幸的是,我在使用 tensorflow 1 时没有找到如何做到这一点。
任何人都可以帮助我吗?
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 中实现相同的目标。