简体   繁体   English

batch_normalization 中错误维度的 beta

[英]beta of wrong dimension in batch_normalization

I am trying to implement batch_normalization in a neural Network in Tensorflow.我正在尝试在 Tensorflow 的神经网络中实现 batch_normalization。 Initialization is done with variable_scope.初始化是用 variable_scope 完成的。 When I run my program, I get an error:当我运行我的程序时,我收到一个错误:

*** ValueError: Trying to share variable scope1/beta, but specified shape (100,) and found shape (100, 1). *** ValueError: 尝试共享变量 scope1/beta,但指定形状 (100,) 并找到形状 (100, 1)。

As I understand it, I must initialize the beta (and the other stored parameters) with a correct dimension.据我了解,我必须用正确的维度初始化 beta(和其他存储的参数)。 I believe that my dimension should be (100,1) as there are 100 hidden units in my first hidden layer.我相信我的维度应该是 (100,1),因为我的第一个隐藏层中有 100 个隐藏单元。 How can I specify the shape as to fit the expectations of my batch_normalization?如何指定形状以符合我的 batch_normalization 的期望?

Here is my code:这是我的代码:

    Layers = [203,100,100,100,2]    

    def initialize_parameters(Layers,m):
        params = {}
        for i in range(len(Layers)):
            if i > 0:
            with tf.variable_scope("scope"+str(i), reuse=None) as sp:
                beta = tf.get_variable("beta", [Layers[i],1], initializer=tf.constant_initializer(0.0))
                gamma = tf.get_variable("gamma",[Layers[i],1], initializer=tf.constant_initializer(1.0))
                moving_avg = tf.get_variable("moving_mean", [Layers[i],1], initializer=tf.constant_initializer(0.0),trainable=False)
                moving_var = tf.get_variable("moving_variance", [Layers[i],1], initializer=tf.constant_initializer(1.0),trainable=False)                
            lastUnits = Layers[i]
        sp.reuse_variables()
        return params

    def forward_propagation(X, Layers, parameters, keep_prob):
        for i in range(len(Layers)):
            ...
            Z_BN = tf.contrib.layers.batch_norm(Z,is_training=True,updates_collections=ops.GraphKeys.UPDATE_OPS,scope="scope"+str(i), reuse=True)
           ...
        return Z_BN

The solution was to just give one number as shape:解决方案是只给出一个数字作为形状:

    beta = tf.get_variable("beta", shape=Layers[i], initializer=tf.constant_initializer(0.0))
    gamma = tf.get_variable("gamma", shape=Layers[i], initializer=tf.constant_initializer(1.0))
    moving_avg = tf.get_variable("moving_mean", shape=Layers[i], initializer=tf.constant_initializer(0.0),trainable=False)
    moving_var = tf.get_variable("moving_variance", shape=Layers[i], initializer=tf.constant_initializer(1.0),trainable=False)                

Hope, this helps.希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM