||
(一)推荐两篇博文,详细清楚,直观明了!!!
博文一:https://mathpretty.com/11223.html
博文二:https://blog.csdn.net/liuxiao214/article/details/81037416
(二)推荐三张图,易于理解,直接了当!!!
(三)示例代码,验证理解
x_test = np.array([[[1,2,-1,1],[3,4,-2,2]],
[[1,2,-1,1],[3,4,-2,2]]])
x_test = torch.from_numpy(x_test).float()
x_test
"""
tensor([[[ 1., 2., -1., 1.],
[ 3., 4., -2., 2.]],
[[ 1., 2., -1., 1.],
[ 3., 4., -2., 2.]]])
"""
关于这里的计算的细节, 会在后面的计算细节描述部分进行叙述. 这里就看一下如何使用Pytorch来进行计算, 和最终计算得到的结果.
LayerNorm就是对(2, 2, 4), 后面这一部分进行整个的标准化. 可以理解为对整个图像进行标准化.
m = nn.LayerNorm(normalized_shape = [2,4])
output = m(x_test)
output
"""
tensor([[[-0.1348, 0.4045, -1.2136, -0.1348],
[ 0.9439, 1.4832, -1.7529, 0.4045]],
[[-0.1348, 0.4045, -1.2136, -0.1348],
[ 0.9439, 1.4832, -1.7529, 0.4045]]], grad_fn=<AddcmulBackward>)
"""
当GroupNorm中group的数量是1的时候, 是与上面的LayerNorm是等价的.
# Separate 2 channels into 1 groups (equivalent with LayerNorm)
m = nn.GroupNorm(num_groups=1, num_channels=2, affine=False)
output = m(x_test)
output
"""
tensor([[[-0.1348, 0.4045, -1.2136, -0.1348],
[ 0.9439, 1.4832, -1.7529, 0.4045]],
[[-0.1348, 0.4045, -1.2136, -0.1348],
[ 0.9439, 1.4832, -1.7529, 0.4045]]])
"""
InstanceNorm就是对(2, 2, 4), 标红的这一部分进行Norm.
m = nn.InstanceNorm1d(num_features=2)
output = m(x_test)
output
"""
tensor([[[ 0.2294, 1.1471, -1.6059, 0.2294],
[ 0.5488, 0.9879, -1.6465, 0.1098]],
[[ 0.2294, 1.1471, -1.6059, 0.2294],
[ 0.5488, 0.9879, -1.6465, 0.1098]]])
"""
上面这种InstanceNorm等价于当GroupNorm时num_groups的数量等于num_channel的数量.
# Separate 2 channels into 2 groups (equivalent with InstanceNorm)
m = nn.GroupNorm(num_groups=2, num_channels=2, affine=False)
output = m(x_test)
output
"""
tensor([[[ 0.2294, 1.1471, -1.6059, 0.2294],
[ 0.5488, 0.9879, -1.6465, 0.1098]],
[[ 0.2294, 1.1471, -1.6059, 0.2294],
[ 0.5488, 0.9879, -1.6465, 0.1098]]])
"""
我们看一下在上面的LayerNorm和InstanceNorm中的结果是如何计算出来的. 我们只看第一行第一列的数据1进行标准化的过程. 下面是详细的计算的过程(这里的计算结果与上面直接计算的结果是相同的).
点滴分享,福泽你我!Add oil!
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-13 08:47
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社