我试图在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
来自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,可能会有麻烦。例如,如果批量标准化中的移位训练到较大的训练输出标度编号,但在测试过程中,相同的移位应用到较小的(由