当前位置: 首页 > 知识库问答 >
问题:

keras批次归一化轴说明

柴衡
2023-03-14

keras批次标准化(BatchNormalization)层使用轴=-1作为默认值,并说明特征轴通常是标准化的。为什么会这样?

我想这是令人惊讶的,因为我更熟悉使用标准缩放器之类的东西,这相当于使用轴=0。这将分别规范化特征。

在KERA中,相对于特征,样本在默认情况下被单独归一化(即轴=-1)有什么原因吗?

编辑:混凝土示例

转换数据以使每个特征具有零均值和单位方差是很常见的。让我们考虑一下这个模拟数据集的“零均值”部分,其中每一行都是一个样本:

>>> data = np.array([[   1,   10,  100, 1000],
                     [   2,   20,  200, 2000],
                     [   3,   30,  300, 3000]])

>>> data.mean(axis=0)
array([    2.,    20.,   200.,  2000.])

>>> data.mean(axis=1)
array([ 277.75,  555.5 ,  833.25])

减去轴=0的平均值,而不是轴=1的平均值,不是更有意义吗?使用轴=1,单位和刻度可以完全不同。

编辑2:

本文第3节的第一个方程似乎暗示轴=0应用于单独计算每个特征的期望和方差,假设您有一个(m, n)形状的数据集,其中m是样本数,n是特征数。

编辑3:另一个示例

我想看看在玩具数据集上计算的均值和方差的维度

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris

from keras.optimizers import Adam
from keras.models import Model
from keras.layers import BatchNormalization, Dense, Input


iris = load_iris()
X = iris.data
y = pd.get_dummies(iris.target).values

input_ = Input(shape=(4, ))
norm = BatchNormalization()(input_)
l1 = Dense(4, activation='relu')(norm)
output = Dense(3, activation='sigmoid')(l1)

model = Model(input_, output)
model.compile(Adam(0.01), 'categorical_crossentropy')
model.fit(X, y, epochs=100, batch_size=32)

bn = model.layers[1]
bn.moving_mean  # <tf.Variable 'batch_normalization_1/moving_mean:0' shape=(4,) dtype=float32_ref>

输入X具有形状(150,4),并且计算的批次归一化层表示4,这意味着它在轴=0上运行。

如果批处理规范化(BatchNormalization)的默认值为轴=-1,那么不应该有150个平均值吗?

共有3个答案

高运诚
2023-03-14

如果您的小批次是矩阵a mxn,即m个样本和n个特征,则规格化轴应为轴=0。正如您所说,我们想要的是分别规范化每个特征,keras中的默认轴=-1,因为当在卷积层中使用时,地物数据集的维度通常是(样本、宽度、高度、通道),批次样本是沿着通道轴(最后一个轴)规范化的。

欧阳正谊
2023-03-14

我知道这篇帖子很老了,但我仍然在回答它,因为Keras文档中仍然存在困惑。我必须通过代码来解决这个问题:

  1. 记录为整数的轴变量实际上可以是表示多个轴的整数列表。因此,例如,如果我的输入有一个NHWC或NCHW格式的图像,如果我想以OP想要的方式执行批次标准化(即仅跨批次维度标准化),请提供axis=[1,2,3]
  2. 轴列表(或整数)应包含计算均值和方差时不希望减少的轴。换言之,它是您想要规范化的轴的补充-如果您按照“轴”的常规定义,则与文档似乎所说的完全相反。因此,例如,如果您的输入I是形状(N,H,W,C)或(N,C,H,W)-即第一个维度是批次维度,您只希望计算整个批次维度的平均值和方差,则应提供轴=[1,2,3]。这将导致KERA分别计算形状(1,H,W,C)或(1,C,H,W)的平均M和方差V张量,即批次维度将由于聚合而边缘化/减少(即平均值或方差在第一维度上计算)。在以后的操作(I-M)和(I-M)/V中,M和V的第一个维度将广播到该批的所有N个样本
  3. BatchNorm层最终调用tf。nn。在本例中,轴为(1,)的力矩!这是因为tf中轴的定义。nn。时刻是正确的
  4. 类似tf。nn。时刻呼唤tf。nn。reduce\u mean,其中轴的定义也是正确的(即与tf、keras、layers、BatchNormalization相反)
  5. 也就是说,BatchNormalization论文建议在批次维度(N)之外,跨HxW空间地图进行规范化。因此,如果遵循该建议,那么axis将只包括通道维度(C),因为这是您不想减少的唯一剩余维度。Keras文档可能暗示了这一点,尽管它相当神秘
韶宏邈
2023-03-14

混淆是由于np.mean中的BatchNormize中的的含义。

当我们沿着一个轴取平均值时,我们折叠该维度并保留所有其他维度。在您的示例中,数据。平均值(轴=0)折叠0轴,这是数据的垂直尺寸。

当我们沿着一个轴计算批次归一化时,我们保留数组的维数,并根据其他轴上的平均值和标准偏差进行归一化。因此,在您的2D示例中,轴为1的批次标准化(BatchNormalization)是减去轴为0的平均值,正如您所期望的那样。这就是bn的原因。移动平均值具有形状(4,)。

 类似资料:
  • 我试图在Keras中创建一个带有输入(批次、通道(3)、64、32)的神经网络,但我使用批次标准化时出现了错误(因为错误从提到的层开始,我选择隔离导致错误的部分)。模型开始如下: 我收到以下异常: 对于输入形状为[1,32,1,1],“batch\u normalization\u 1/cond/Reformate\u 4”(操作:“Reformate”)的形状必须为秩1,但为秩0。 我认为数据从

  • 我正在尝试实现批处理规范化(http://arxiv.org/pdf/1502.03167.pdf)在我的卷积神经网络中,我真的很困惑,我应该围绕什么轴来计算均值和方差。 如果conv层的输入为3*224*224*32的形状,其中: 3-输入通道 224*224-单通道形状 32-小批量大小 以下公式中的轴应该是多少?平均值=numpy。平均值(输入层,轴=?) 并且,如果完全连接层的输入为100

  • 本节我们介绍批量归一化(batch normalization)层,它能让较深的神经网络的训练变得更加容易 [1]。在 “实战Kaggle比赛:预测房价” 一节里,我们对输入数据做了标准化处理:处理后的任意一个特征在数据集中所有样本上的均值为0、标准差为1。标准化处理输入数据使各个特征的分布相近:这往往更容易训练出有效的模型。 通常来说,数据标准化预处理对于浅层模型就足够有效了。随着模型训练的进行

  • 我的问题是批处理规范化(BN)正在规范化什么。 我在问,BN是单独标准化每个像素的通道还是一起标准化所有像素的通道。它是在每张图像的基础上还是在整个批次的所有通道上进行的。 具体而言,BN在X上运行。比如说,。因此,当轴=3时,它在“c”维度上运行,即通道数(对于rgb)或特征图数。 因此,假设X是rgb,因此有3个通道。BN是否做到了以下几点:(这是BN的简化版本,用于讨论维度方面。我知道gam

  • 我用TensorFlow来解决一个多目标回归问题。具体地说,在具有逐像素标记的卷积网络中,输入为图像,标签为“热图”,其中每个像素具有浮点值。更具体地说,每个像素的地面真值标记的下界为零,虽然技术上没有上界,但通常不会大于1e-2。 在不进行批量归一化的情况下,该网络能够给出合理的热图预测。通过批量归一化,网络需要很长时间才能获得合理的损耗值,而它所做的最好的工作就是使每个像素都成为平均值。这是使