如何使用批量归一化对所有轴进行归一化?

时间:2019-04-16 12:27:06

标签: python tensorflow batch-normalization

据我了解,对于tf.layers.batch_normalization,我定义的轴是经过标准化的轴。

简单地说:

给出这些值

a = [[0, 2], 
     [1, 4]]

具有形状(2,2),因此具有轴0和1。

对轴1进行归一化意味着将轴0减小到其平均值和标准偏差,然后将这些值用于归一化。

因此

bn = tf.layers.batch_normalization(a, axis=[1])

将(几乎)具有与

相同的结果
m, v = tf.nn.moments(a, axes=[0])
bn = (a - m) / tf.sqrt(v)

但是我该如何对所有轴进行tf.layers.batch_normalization

使用之前的平均值和标准偏差计算将很容易:

m, v = tf.nn.moments(a, axes=[0, 1])
bn = (a - m) / tf.sqrt(v)

但是如何通过批量归一化来做到这一点?

bn = tf.layers.batch_normalization(a, axis=[???])

我尝试了以下无效的方法:

  • axis = NoneAttributeError: 'BatchNormalization' object has no attribute 'axis'
  • axis = []IndexError: list index out of range
  • axis = [0, 1]:所有结果均为零

2 个答案:

答案 0 :(得分:0)

不幸的是,我认为使用Tensorflow API的batch_normalization层/功能是不可行的。

正如函数名称所暗示的那样,它旨在执行“批处理”归一化,因此可以在给定当前批处理(通常为0维)的情况下在功能轴上进行归一化。

答案 1 :(得分:0)

这可以通过layer normalization来实现:

        function getProductByCode(code) {
            return txt.filter(
                function(data){ return data.Product == code }
            )[0];
        }

        var txt = [{"Product":"7318802U","Amount":"5"},{"Product":"7304773U","Amount":"1"}];
        
        var jsonObj = eval(txt);
        
        var Products = ["7318802U","7304773U","7212UCSS"];
        
        
        function _isContains(json, value) {
            let contains = false;
            Object.keys(json).some(key => {
                contains = typeof json[key] === 'object' ? _isContains(json[key], value) : json[key] === value;
                return contains;
            });
            return contains;
        }
        
        for(var i = 0; i<Products.length; i++)
        {
                if(_isContains(jsonObj, Products[i])) 
            {
                console.info(Products[i] + " exist")
                var u = getProductByCode(Products[i]).Amount;
                console.info("Amount: "+u )
            
            }
            else {
            console.info(Products[i] + " not exist")
            console.info("Amount: 0")
            }
        }
        
        
                //console.info(_isContains(jsonObj, "7318802U"));

与批次归一化的区别在于,层归一化将操作分别应用于批次中的每个单元。

如果要对批处理执行此操作,则应遵循批处理规范。同样,这可以通过将轴设置为列表来实现。