【手撕算法系列】BN

news/2024/7/7 19:13:36

BN的计算公式

在这里插入图片描述

BN中均值与方差的计算

在这里插入图片描述

所以对于输入x: b,c,h,w
则 mean: 1,c,1,1
	var: 1,c,1,1

代码

class BatchNorm(nn.Module):
    def __init__(self, num_features, num_dims):
        # num_features:完全连接层的输出数量或卷积层的输出通道数。
        # num_dims:2表示完全连接层,4表示卷积层    
        super().__init__()
        if num_dims == 2:
            shape = (1, num_features)
        else:
            shape = (1, num_features, 1, 1)
        # 参与求梯度和迭代的拉伸和偏移参数,分别初始化成1和0
        self.gamma = nn.Parameter(torch.ones(shape))
        self.beta = nn.Parameter(torch.zeros(shape))
        # 非模型参数的变量初始化为0和1
        self.moving_mean = torch.zeros(shape)
        self.moving_var = torch.ones(shape)
 
    def forward(self, x, momentum=0.9, eps=1e-5):
        if self.training:
            assert len(x.shape) in (2, 4)
            #判断是全连接层还是卷积层,2代表全连接层,样本数和特征数;4代表卷积层,批量数,通道数,高宽
            if len(x.shape) == 2:
                # 使用全连接层的情况,计算特征维上的均值和方差
                mean = x.mean(dim=0, keepdim=True)
                var = x.var(dim=0, keepdim=True)
            else:
                # 使用二维卷积层的情况,计算通道维上(axis=1)的均值和方差。
                mean = x.mean(dim=(0, 2, 3), keepdim=True)  # 1, c, 1, 1
                var = x.var(dim=(0, 2, 3), keepdim=True)

            # 训练模式下,用当前的均值和方差做标准化
            x_hat = (x - mean) / torch.sqrt(var + eps)
            # 更新移动平均的均值和方差
            self.moving_mean = momentum * self.moving_mean + (1.0 - momentum) * mean
            self.moving_var = momentum * self.moving_var + (1.0 - momentum) * var
        
        else:
            x_hat = (x - self.moving_mean) / torch.sqrt(self.moving_var + eps)

        out = self.gamma * x_hat + self.beta
        return out


http://lihuaxi.xjx100.cn/news/1898644.html

相关文章

电子元器件介绍——电容(二)

电子元器件 文章目录 电子元器件前言2.1 电容的基本知识2.2 电容的等效电路2.3 电容的分类2.4电容的特性参数2.5电容的作用旁路(去耦)高低通滤波 2.6 两端电容2.7电容的失效 总结 前言 这节我们介绍电容。 2.1 电容的基本知识 电容器是一种能储存电荷…

docker-compose的介绍与使用

一、docker-compose 常用命令和指令 1. 概要 默认的模板文件是 docker-compose.yml,其中定义的每个服务可以通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。 注意如果使用 build 指令,在 Dockerfile 中设置的…

图书管理系统jsp + servlet+mysql

图书管理系统 项目使用jsp servletmysql实现; 登陆注册 首页 首页显示图书信息 图书管理 1添加书籍 2查询书籍 3预览书籍 4修改书籍 用户管理 1查询用户 2修改用户 3 删除用户 链接:https://pan.baidu.com/s/1QXK--ypb6OadbmKFlc0jUQ

ios苹果app应用程序录屏开发有哪些难点和注意点?

Hello,各位同学们好,我是咕噜铁蛋,老朋友们应该知道我经常关注并分享各种移动应用开发的技术和经验。在这篇文章中,铁蛋将为大家介绍分享苹果iOS录屏开发的难点和注意点! 首先,让我们简单了解一下iOS录屏的…

FC-13A(用于汽车应用的kHz范围晶体单元,低轮廓贴片)

FC-13A晶体非常适合用在汽车导航系统设计中的应用,是一种具有优异的频率性能和AEC-Q200标准认证的汽车工业级高精度晶体,FC-13A是一款尺寸为3.2 1.5 0.9mm,频率范围32.768KHz耐高温晶振,频率温度系数仅为-0.04ppm/℃,并且其老化…

springboot 学习网站

Spring Boot 系列教程https://www.docs4dev.com/ Spring Boot 教程汇总 http://www.springboot.wiki/ Spring Cloud 微服务教程 http://www.springboot.wiki/ 1、自定义banner   https://www.cnblogs.com/cc11001100/p/7456145.html 2、事件和监听器   https://blog.csd…

“Kubernetes完全解析:从初学者到专家”

K8S已经成为容器编排和管理的标准,并且已经在各行各业中广泛应用,随着云计算,微服务和DevOps的进一步发展,它已经成为未来的趋势,那么如何快速入门K8s呢?下面我们快速对K8s进行入门。 1、容器技术概念&…

第十八章 : Spring Boot 集成RabbitMQ(二)

第十八章 : Spring Boot 集成RabbitMQ(二) 前言 本章重点:RabbitMQ的5种消息模式:简单队列、工作队列、发布订阅、路由、广播等5种消息模式的代码示例,包括运行环境,帮助读者动手实践,达到深入理解目标。 Springboot 版本 2.3.2.RELEASE ,RabbitMQ 3.9.11,Erlang 2…