GN层(Pytorch)

BN层存在的问题:
BN层的模型效果取决于Batch_size大小,那么我的实验分别在batch_size=4和batch_size=8的情况下运行的,这些batch_size都无法让BN层真正起到作用,甚至负作用,我个人感觉4的效果比8好这就是个运气问题(下面一段我利用BN层原理对这个运气问题进行了分析)。那么同样为4的batch_size进行若干次实验,是否结果会出现很大的波动?关于这个实验我现在也在继续补做.如果有很大波动则代表我的实验具有一定的偶然性.这种结果是不可信的.其实这里的batch_size=4和batch_size=8,batch_size=4的AP能到74,但batch_size=8的AP却只有70.这里就已经说明了我们的实验结果存在偶然性了。

BN层中的running_mean,running_var都是训练最后一次更新后的值,那么每一个mini_batch的数据不一样导致了每一次的running_mean,以及running_var都不一样.当用这些不同的running_mean和running_var去test我的测试集时自然导致了我结果的不一致性.并且batch_size=4和batch_size=8都无法让这些mean和var接近真实数据集的均值方差。若我不使用BN层采用FrozenBN层(即不去更新BN层中的四个参数),我的数据集是医学数据集,直接用自然数据集的均值方差去BN医学数据集显然是不合理的。
那么如果我把batch_size调大呢?这显然也是不行的,因为检测网络,语义分割等等,为保证精度,都是不会把图像进行放缩到224大小的。同时网络都是非常大的,原Faster R-CNN论文中明确指定了batch_size=1,因为其用的backbone网络是ZF或者VGG16,这些网络里面都不含有BN层,所以其batch_size对结果的影响并不大。我自己的电脑显存是11G,只能运行batch_size=4,如果要运行batch_size=32那起码需要80G显存多GPU混合训练。而且这还只是在我没有做任何改进的情况下.

所以为了解决上述问题。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().

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
感知器(pytorch)是一种神经网络模型,它由多个全连接组成。在pytorch中,可以使用torch.nn.Linear函数来实现多感知器的全连接。 一个典型的多感知器(pytorch)的结构通常包含输入、多个隐藏和输出。例如,使用MNIST数据集进行实例化时,输入通常有784个节点(即28×28),而隐藏可以有任意数量的节点,比如100个节点。最后,输出通常有10个节点,用于表示不同类别的预测结果。 通过构建多个全连接并使用适当的激活函数,多感知器(pytorch)可以学习将输入数据映射到输出结果,从而实现分类、回归等任务。在训练过程中,通过反向传播算法更新网络参数,以最小化损失函数并提高预测性能。 总结起来,多感知器(pytorch)是一种由多个全连接组成的神经网络模型,在pytorch中可以使用torch.nn.Linear函数来实现全连接。它可以用于解决分类、回归等任务,并通过反向传播算法进行训练和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [pytorch 实现MLP(多感知机)](https://blog.csdn.net/robator/article/details/121797902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值