F范数的定义:A为 m ∗ m m*m mm的矩阵
∣ ∣ A ∣ ∣ F = ∑ i n ∑ j n a i j 2 \begin{aligned} ||A||_F=\sqrt{\sum_{i}^n{\sum_j^n}a_{ij}^2} \end{aligned} AF=injnaij2
计算矩阵的每个元素的平方之后的加和然后开方。
  在矩阵分解问题中,为了优化所近似求解的矩阵,往往都会用到F范数作为损失函数的正则项。在matlab中求解范数的函数为norm(X, ‘fro’),在python中为numpy.linalg.norm(x,ord=None),其中x是求解的数值,ord是求解范数的类型,默认的是F范数其实也是二范数。
  在Pytorch中计算F范数的方法为torch.norm(X, ‘norm’),在深度学习中有时需要自定义损失函数就用到了F范数,如果自己不想重写函数的话完全可以用torch.nn.MSELoss定义。因为这两个函数的计算方法大体一致,主要区别就在于MSELoss(nn.MSELoss详解)的设置中是否除以样本数,以及F范数是否开方的问题。
下面看个例子:

import numpy as np
import torch
import torch.nn as nn


X = np.array([[1, 1, 1],
              [2, 2, 2],
              [3, 3, 3]])

Y = X*2

print(X)
[[1 1 1]
 [2 2 2]
 [3 3 3]]
print(Y)
[[2 2 2]
 [4 4 4]
 [6 6 6]]
a = np.linalg.norm(X-Y)
print(a*a)
42.0
X1 = torch.from_numpy(X)
Y1 = torch.from_numpy(Y)

loss_fn2 = torch.nn.MSELoss(reduction='sum')
loss2 = loss_fn2(X1.float(), Y1.float())
print(loss2)
tensor(42.)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐