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

批量规格化中的维度

苗盛
2023-03-14

我试图在Tensorflow中构建一个通用的批处理规范化函数。

在这篇文章中,我学习了批处理规范化,我发现这很好。

我有一个问题与规模和beta变量的维度:在我的情况下,批处理规范化应用于每个卷积层的每个激活,因此,如果我有卷积层的输出一个大小的tersor:

[57,57,96]

我需要刻度和beta与卷积层输出具有相同的尺寸,对吗?

这是我的函数,程序可以运行,但我不知道是否正确

def batch_normalization_layer(batch):
   # Calculate batch mean and variance
    batch_mean, batch_var = tf.nn.moments(batch, axes=[0, 1, 2])

    # Apply the initial batch normalizing transform
    scale = tf.Variable(tf.ones([batch.get_shape()[1],batch.get_shape()[2],batch.get_shape()[3]]))
    beta = tf.Variable(tf.zeros([batch.get_shape()[1],batch.get_shape()[2],batch.get_shape()[3]]))

    normalized_batch = tf.nn.batch_normalization(batch, batch_mean, batch_var, beta, scale, 0.0001)

    return normalized_batch

共有1个答案

方心思
2023-03-14

来自tf的文档。nn。batch\u规范化:

平均值、方差、偏移量和比例均应为以下两种形状之一:

一般来说,它们可以具有与输入x相同的维数,对于未规范化的维度(“深度”维度),它们可以具有与x相同的尺寸,对于其他正在规范化的维度,它们可以具有与1相同的尺寸。在这种情况下,均值和方差通常是tf的输出。nn。训练期间的力矩(…,keep\u dims=True),或推断期间的运行平均值。

在通常情况下,“深度”维度是输入张量x中的最后一个维度,它们可能是与“深度”维度大小相同的一维张量。例如,对于完全连接层的通用[批次,深度]布局,以及卷积的[批次,高度,宽度,深度]布局,都是这种情况。在这种情况下,均值和方差通常是tf的输出。nn。训练期间的力矩(…,keep\u dims=False),或推理期间的运行平均值。

使用您的值(比例=1.0和偏移量=0),您也可以只提供值

 类似资料:
  • 在TensorFlow中执行批量规格化的正确方法是什么?(即,我不想计算连续均值和方差)。我当前的实现基于tf。nn。batch\u normalization(批次规格化),其中x是具有形状的卷积层的输出。[批次大小、宽度、高度、通道数]。我想在通道方面执行批处理规范。 但这种实施的结果非常糟糕。与tensorflow比较。承包商。苗条的batch\u norm显示其票价较低(同样糟糕的培训表现

  • 我想使用Batchnormalization来规范化批次维度,但keras中的批次维度自然是无维度的。那我该怎么办呢。 keras示例显示,conv2d的轴为-1,这表示通道尺寸。 轴:整数,应规格化的轴(通常是特征轴)。例如,在具有data\u format=“channels\u first”的Conv2D层之后,在BatchNormalization中设置axis=1。

  • 我正在实现一个依赖于3D卷积的模型(对于类似于动作识别的任务),我想使用批量规范化(参见 下面的代码引用了TensorFlow r0.12,它显式地引用了变量——我的意思是我没有使用tf。承包商。学习tf以外的内容。承包商。图层。batch\u norm()函数。我这样做是为了更好地理解事情是如何运作的,并且有更多的实现自由度(例如,变量摘要)。 我将通过首先编写完全连接层的示例,然后编写2D卷积

  • 我可以在输入层之后使用批处理规范化层而不规范化我的数据吗?我可以期望得到类似的效果/性能吗? 在keras函数中,它应该是这样的:

  • 我使用Tensorflow 1.14.0和Keras 2.2.4。以下代码实现了一个简单的神经网络: 20个时代后的最终val\u损失为0.7751。当我取消注释添加批处理规范化层的唯一注释行时,val\u损失变为1.1230。 我的主要问题要复杂得多,但同样的事情也会发生。因为我的激活是线性的,所以我把批处理规范化放在激活之后还是之前并不重要。 问题:为什么批处理规范化帮不上忙?是否有什么可以更

  • 最初的问题是专门针对TensorFlow实现的。然而,答案是针对一般实现的。这个一般答案也是TensorFlow的正确答案。 在TensorFlow中使用批处理规范化和退出(特别是使用contrib.layers)时,我需要担心排序吗? 如果我在批处理规范化之后立即使用dropout,可能会有麻烦。例如,如果批量标准化中的移位训练到较大的训练输出标度编号,但在测试过程中,相同的移位应用到较小的(由