神经网络学习小记录31——l1、l2标准化及其python代码实现
学习前言
最近看了一下facenet,发现自己居然连l2标准化都不知道,写篇文章水一下。
什么是l1、l2标准化
1、范数
我们需要知道的范数主要是两种:
1-范数:
,即向量元素绝对值之和 。
2-范数:
,Euclid范数(欧几里得范数,常用计算向量长度),即向量元素绝对值的平方和再开方。
2、l1标准化和l2标准化
其实概念并不复杂,实际上是:
L1标准化:每个元素/L1范数;
L2标准化:每个元素/L2范数;
python代码实现
import numpy as np
#---------------------------------#
# l1标准化
#---------------------------------#
def l1_normalize(x, epsilon=1e-10):
output = x / np.maximum(np.sum(np.abs(x)),epsilon)
return output
#---------------------------------#
# l2标准化
#---------------------------------#
def l2_normalize(x, axis=-1, epsilon=1e-10):
output = x / np.sqrt(np.maximum(np.sum(np.square(x), axis=axis, keepdims=True),epsilon))
return output
a = np.arange(12).reshape([1,3,4])
l1 = l1_normalize(a)
l2 = l2_normalize(a,(1,2))
print(a,"\n")
print(l1,"\n")
print(l2,"\n")
结果如下:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]]
[[[0. 0.01515152 0.03030303 0.04545455]
[0.06060606 0.07575758 0.09090909 0.10606061]
[0.12121212 0.13636364 0.15151515 0.16666667]]]
[[[0. 0.04445542 0.08891084 0.13336627]
[0.17782169 0.22227711 0.26673253 0.31118796]
[0.35564338 0.4000988 0.44455422 0.48900965]]]