mx.nd.BatchNorm 类似于在一个batch里面对样本减均值、除方差。
mx.nd.L2Normalization 对向量进行归一化:每一行向量中的每个元素除以向量的模长。变成长度为1、带有方向的单位向量。
mx.nd.norm 用于沿指定axis求范数,默认求整个矩阵的L2范数,变成一个值(标量)。(L2范数)对应欧式距离。
nd.L2Normalization(a,mode=‘instance’)
# nd.L2Normalization(a,mode='instance') 是对每个样本(向量,每一行)分别进行L2归一化,就是每一行向量中的每个元素除以向量的模长
a
Out[20]:
[[1. 2.]
[3. 4.]]
<NDArray 2x2 @cpu(0)>
nd.L2Normalization(a,mode='instance')
Out[21]:
[[0.4472136 0.8944272]
[0.6 0.8 ]]
<NDArray 2x2 @cpu(0)>
# 对于地一个样本:[1,2],就相当于
1/np.sqrt(1*1+2*2)
Out[22]: 0.4472135954999579
2/np.sqrt(1*1+2*2)
Out[23]: 0.8944271909999159
# 第二个样本依次类推
求两个向量差的L2范数,也就是求欧氏距离:
The input F is an mxnet.ndarry or an mxnet.symbol if we hybridize the network. Gluon’s Loss base class is in fact a HybridBlock. This means we can either run imperatively or symbolically. When we hybridize our custom loss function, we can get performance speedups.
F就当作是mxnet.nd吧,当然也可以是symbol,这就是hybridize的奥义??
margin=6
distances_squared = F.sum(F.square(distances), 1, keepdims=True)
euclidean_distances = F.sqrt(distances_squared + 0.0001)
d = F.clip(margin - euclidean_distances, 0, margin)