使用TensorFlow实现批量归一化

我正在尝试在tensor-flow中实现一个批量归一化层。我使用tf.moments来获取均值方差,在训练步骤中运行没有问题。

在测试时,我希望设置一个指数移动平均来跟踪均值和方差。我尝试这样做:

def batch_normalized_linear_layer(state_below, scope_name, n_inputs, n_outputs, stddev, wd, eps=.0001):  with tf.variable_scope(scope_name) as scope:    weight = _variable_with_weight_decay(      "weights", shape=[n_inputs, n_outputs],      stddev=stddev, wd=wd    )    act = tf.matmul(state_below, weight)    # 获取矩    act_mean, act_variance = tf.nn.moments(act, [0])    # 获取均值和方差变量    mean = _variable_on_cpu('bn_mean', [n_outputs], tf.constant_initializer(0.0))    variance = _variable_on_cpu('bn_variance', [n_outputs], tf.constant_initializer(1.0))    # 分配矩    assign_mean = mean.assign(act_mean)    assign_variance = variance.assign(act_variance)    act_bn = tf.mul((act - mean), tf.rsqrt(variance + eps), name=scope.name+"_bn")    beta = _variable_on_cpu("beta", [n_outputs], tf.constant_initializer(0.0))    gamma = _variable_on_cpu("gamma", [n_outputs], tf.constant_initializer(1.0))    bn = tf.add(tf.mul(act_bn, gamma), beta)    output = tf.nn.relu(bn, name=scope.name)    _activation_summary(output)  return output, mean, variance

其中_variable_on_cpu定义如下:

def _variable_on_cpu(name, shape, initializer):  """在CPU内存上创建变量的辅助函数。  Args:    name: 变量名称    shape: 整数列表    initializer: 变量的初始化器  Returns:    Variable Tensor  """  with tf.device('/cpu:0'):    var = tf.get_variable(name, shape, initializer=initializer)  return var

我认为我设置

assign_mean = mean.assign(act_mean)assign_variance = variance.assign(act_variance)

的方式可能不正确,但我并不确定具体问题在哪里。当我使用TensorBoard来跟踪这些均值和方差变量时,它们的值始终保持在初始化的值上。


回答:

@的人的评论指出了问题的核心:你没有运行分配节点。你可以尝试使用我在另一个回答中发布的批量归一化辅助函数 – 如何在TensorFlow中使用批量归一化? – 或者你可以按照他的建议,通过添加with_dependencies来强制执行分配操作。

一般原则是,只有当数据或控制依赖关系“通过”节点时,你才能指望该节点被运行。with_dependencies确保在使用输出操作之前,指定的依赖关系已经完成。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注