ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

GN层(Pytorch)

2021-07-06 23:06:21  阅读:402  来源: 互联网

标签:None BN channels Pytorch num var GN mean


BN层存在的问题:
BN层的模型效果取决于Batch_size大小,那么我的实验分别在batch_size=4和8的情况下运行的,这些batch_size都无法让BN层真正起到作用,甚至负作用,我个人感觉4的效果比8好这就是个运气问题,BN层中的running_mean,running_var都是最后一次更新后的值,那么每一个mini_batch的影响都不一样,4和8无法让这些mean和var接近真实数据集的均值方差。若我不使用BN层采用FrozenBN层(即不去更新BN层中的四个参数),我的数据集是医学数据集,直接用自然数据集去BN医学数据集显然是不合理的。
那么如果我把batch_size调大呢?这显然也是不行的,因为检测网络,语义分割等等,为保证精度,都是不会把图像进行放缩到224大小的。同时网络都是非常大的,我自己的电脑显存是11G,只能运行batch_size=4,如果要运行batch_size=32那成本太高。所以为了解决上述问题。Kaiming He在2018年ECCV上发表了《Group Normalization》
GN层:
在这里插入图片描述
GN层不在依赖 batch_size大小了,其将Channel分为多个组,在每一个组中求均值方差。这里附上代码

import torch
import torch.nn as nn
def group_norm(x:torch.Tensor,
               num_groups: int,
               num_channels: int,
               eps: float = 1e-5,
               gamma: float = 1.0,
               beta: float = 0):
    channels_per_group = num_channels//num_groups
    new_tensor = []
    for t in x.split(channels_per_group, dim=1):
        var_mean = torch.var_mean(t, dim=[1, 2, 3], unbiased=False)
        var = var_mean[0]
        mean = var_mean[1]
        mean = mean.unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(t)
        #t = (t-mean[:, None, None, None])/torch.sqrt(var[:, None, None, None]+eps)
        t = (t - mean) / torch.sqrt(var[:, None, None, None] + eps)
        t = t*gamma+beta
        new_tensor.append(t)

    new_tensor = torch.cat(new_tensor, axis=1)
    return new_tensor

num_groups = 2
num_channels = 4
eps = 1e-5
img = torch.randn(2, num_channels, 2, 2)

gn = nn.GroupNorm(num_groups=num_groups, num_channels=num_channels, eps=eps)

r1 = gn(img)
print(r1)
r2 = group_norm(img, num_groups=num_groups, num_channels=num_channels, eps=eps)
print(r2)

其跟BN有点类似,但是求均值方差的方法跟以前不一样了。这里针对每一个mini_batch执行同样的处理,先将Channel分组,代码中是2,即分为两组,每一组求得该mini_batch上该Group的图像均值方差
然后在进行减均值除方差操作。同BN一样,网络也需要去学习一个gamma,beta参数。最后在进行加权。这里相比于BN,少了一个running_mean和running_std参数。言外之意网络只需要去学习gamma和beta参数。同时训练和测试都采用同样的模式,而不用model.eval().

标签:None,BN,channels,Pytorch,num,var,GN,mean
来源: https://blog.csdn.net/weixin_40825364/article/details/118531275

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有