在inside-outside-net中,使用了将不同尺度特征concat的方法,来达到更好效果。在concat之前,使用了在通道维度上norm的办法,这个操作在TensorFlow中使用tf.nn.l2_normalize函数。
先看看函数声明
def l2_normalize(x, axis=None, epsilon=1e-12, name=None, dim=None):
重要的参数是前两个,x是数据张量,axis是指定要在哪一维度上进行norm。
实验代码
import tensorflow as tf
data = tf.constant([[1,2,3],[4,5,6],[7,8,9]],dtype=tf.float32)
result_1 = tf.nn.l2_normalize(data,axis=0)
result_2 = tf.nn.l2_normalize(data,axis=1)
with tf.Session() as sess:
print(sess.run(data))
print('-----')
print(sess.run(result_1))
print('-----')
print(sess.run(result_2))
实验结果
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]
-----
[[0.12309149 0.20739034 0.26726127]
[0.49236596 0.51847583 0.53452253]
[0.86164045 0.82956135 0.80178374]]
-----
[[0.26726124 0.5345225 0.8017837 ]
[0.45584232 0.5698029 0.6837635 ]
[0.5025707 0.5743665 0.64616233]]
结论:
指定axis为0,则在数据张量的第一个维度上进行计算,得到的结果是按照如下公式得到的:
output = x / sqrt(max(sum(x**2), epsilon))
用(3,3)的张量举例,在第一个维度上计算每一列的模,就是计算每一列的模值,然后,每一列的值都除以对应的模值。