NJU1healer的个人博客分享 http://blog.sciencenet.cn/u/NJU1healer

博文

BatchNorm, LayerNorm, InstanceNorm和GroupNorm总结

已有 5205 次阅读 2020-10-23 20:26 |个人分类:Pytorch|系统分类:科研笔记

(一)推荐两篇博文,详细清楚,直观明了!!!

博文一:https://mathpretty.com/11223.html

博文二:https://blog.csdn.net/liuxiao214/article/details/81037416

(二)推荐三张图,易于理解,直接了当!!!

image.png

image.png

image.png

(三)示例代码,验证理解

生成测试使用数据

  1. x_test = np.array([[[1,2,-1,1],[3,4,-2,2]],

  2.                    [[1,2,-1,1],[3,4,-2,2]]])

  3. x_test = torch.from_numpy(x_test).float()

  4. x_test

  5. """

  6. tensor([[[ 1.,  2., -1.,  1.],

  7.          [ 3.,  4., -2.,  2.]],


  8.         [[ 1.,  2., -1.,  1.],

  9.          [ 3.,  4., -2.,  2.]]])

  10. """

测试LayerNorm与GroupNorm

关于这里的计算的细节, 会在后面的计算细节描述部分进行叙述. 这里就看一下如何使用Pytorch来进行计算, 和最终计算得到的结果.

LayerNorm就是对(2, 2, 4), 后面这一部分进行整个的标准化. 可以理解为对整个图像进行标准化.

  1. m = nn.LayerNorm(normalized_shape = [2,4])

  2. output = m(x_test)

  3. output

  4. """

  5. tensor([[[-0.1348,  0.4045, -1.2136, -0.1348],

  6.          [ 0.9439,  1.4832, -1.7529,  0.4045]],


  7.         [[-0.1348,  0.4045, -1.2136, -0.1348],

  8.          [ 0.9439,  1.4832, -1.7529,  0.4045]]], grad_fn=<AddcmulBackward>)

  9. """

GroupNorm中group的数量是1的时候, 是与上面的LayerNorm是等价的.

  1. # Separate 2 channels into 1 groups (equivalent with LayerNorm)

  2. m = nn.GroupNorm(num_groups=1, num_channels=2, affine=False)

  3. output = m(x_test)

  4. output

  5. """

  6. tensor([[[-0.1348,  0.4045, -1.2136, -0.1348],

  7.          [ 0.9439,  1.4832, -1.7529,  0.4045]],


  8.         [[-0.1348,  0.4045, -1.2136, -0.1348],

  9.          [ 0.9439,  1.4832, -1.7529,  0.4045]]])

  10. """

测试InstanceNorm和GroupNorm

InstanceNorm就是对(2, 2, 4), 标红的这一部分进行Norm.

  1. m = nn.InstanceNorm1d(num_features=2)

  2. output = m(x_test)

  3. output

  4. """

  5. tensor([[[ 0.2294,  1.1471, -1.6059,  0.2294],

  6.          [ 0.5488,  0.9879, -1.6465,  0.1098]],


  7.         [[ 0.2294,  1.1471, -1.6059,  0.2294],

  8.          [ 0.5488,  0.9879, -1.6465,  0.1098]]])

  9. """

上面这种InstanceNorm等价于当GroupNormnum_groups的数量等于num_channel的数量.

  1. # Separate 2 channels into 2 groups (equivalent with InstanceNorm)

  2. m = nn.GroupNorm(num_groups=2, num_channels=2, affine=False)

  3. output = m(x_test)

  4. output

  5. """

  6. tensor([[[ 0.2294,  1.1471, -1.6059,  0.2294],

  7.          [ 0.5488,  0.9879, -1.6465,  0.1098]],


  8.         [[ 0.2294,  1.1471, -1.6059,  0.2294],

  9.          [ 0.5488,  0.9879, -1.6465,  0.1098]]])

  10. """

计算细节描述

       我们看一下在上面的LayerNorm和InstanceNorm中的结果是如何计算出来的. 我们只看第一行第一列的数据1进行标准化的过程. 下面是详细的计算的过程(这里的计算结果与上面直接计算的结果是相同的).

image.png

点滴分享,福泽你我!Add oil!



https://blog.sciencenet.cn/blog-3428464-1255535.html

上一篇:torch. nn.Softmax(dim=1)或torch. nn.Softmax(dim=-1)
下一篇:Python 中的几种矩阵乘法 np.dot, np.multiply, *
收藏 IP: 103.149.249.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

全部作者的其他最新博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-13 08:47

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部