据我了解,对于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 = None
:AttributeError: 'BatchNormalization' object has no attribute 'axis'
axis = []
:IndexError: list index out of range
axis = [0, 1]
:所有结果均为零答案 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"));
与批次归一化的区别在于,层归一化将操作分别应用于批次中的每个单元。
如果要对批处理执行此操作,则应遵循批处理规范。同样,这可以通过将轴设置为列表来实现。