Batch Normalization(BN)Python实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def Batchnorm_simple_for_train(x, gamma, beta, bn_param):
"""
param:x    : 输入数据,设shape(B,L)
param:gama : 缩放因子  γ
param:beta : 平移因子  β
param:bn_param   : batchnorm所需要的一些参数
	eps      : 接近0的数,防止分母出现0
	momentum : 动量参数,一般为0.9, 0.99, 0.999
	running_mean :滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
	running_var  : 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
"""
	running_mean = bn_param['running_mean']  #shape = [B]
    running_var = bn_param['running_var']    #shape = [B]
	results = 0. # 建立一个新的变量
    
	x_mean=x.mean(axis=0)  # 计算x的均值
    x_var=x.var(axis=0)    # 计算方差
    x_normalized=(x-x_mean)/np.sqrt(x_var+eps)       # 归一化
    results = gamma * x_normalized + beta            # 缩放平移

    running_mean = momentum * running_mean + (1 - momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var
    
    #记录新的值
    bn_param['running_mean'] = running_mean
    bn_param['running_var'] = running_var 
    
	return results , bn_param

滑动平均法记录mean和var,用于测试。
在这里插入图片描述

def Batchnorm_simple_for_test(x, gamma, beta, bn_param):
"""
param:x    : 输入数据,设shape(B,L)
param:gama : 缩放因子  γ
param:beta : 平移因子  β
param:bn_param   : batchnorm所需要的一些参数
	eps      : 接近0的数,防止分母出现0
	momentum : 动量参数,一般为0.9, 0.99, 0.999
	running_mean :滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
	running_var  : 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
"""
	running_mean = bn_param['running_mean']  #shape = [B]
    running_var = bn_param['running_var']    #shape = [B]
	results = 0. # 建立一个新的变量
   
    x_normalized=(x-running_mean )/np.sqrt(running_var +eps)       # 归一化
    results = gamma * x_normalized + beta            # 缩放平移
    
	return results , bn_param

【深度学习】批归一化(Batch Normalization):https://blog.csdn.net/vict_wang/article/details/88075861
Batch Normalization原理与python实现:https://zhuanlan.zhihu.com/p/100672008
基础 | batchnorm原理及代码详解:https://blog.csdn.net/qq_25737169/article/details/79048516

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 PyTorch 中,可以使用 `nn.BatchNorm` 模块实现 Batch Normalization。该模块需要指定输入数据的维度,即 `num_features` 参数。 以下是一个示例代码: ```python import torch.nn as nn # 定义一个包含 BatchNorm 的神经网络 class Net(nn.Module): def __init__(self, input_size, num_classes): super(Net, self).__init__() self.fc1 = nn.Linear(input_size, 256) self.bn1 = nn.BatchNorm1d(256) # BatchNorm 模块 self.relu = nn.ReLU() self.fc2 = nn.Linear(256, 128) self.bn2 = nn.BatchNorm1d(128) # BatchNorm 模块 self.fc3 = nn.Linear(128, num_classes) def forward(self, x): out = self.fc1(x) out = self.bn1(out) out = self.relu(out) out = self.fc2(out) out = self.bn2(out) out = self.relu(out) out = self.fc3(out) return out ``` 在上述代码中,我们定义了一个包含两个 BatchNorm 模块的神经网络,分别在全连接层和激活函数之间使用。在前向传递过程中,我们首先将输入 `x` 传递给第一个全连接层 `fc1`,然后将输出传递给 BatchNorm 模块 `bn1`,再传递给激活函数 `relu`,以此类推。最后,我们将输出传递给最后一个全连接层 `fc3`,并返回其结果。 要使用该神经网络进行训练,我们可以使用以下代码: ```python import torch.optim as optim import torch.nn.functional as F # 初始化神经网络和优化器 net = Net(input_size, num_classes) optimizer = optim.Adam(net.parameters(), lr=0.001) # 训练神经网络 for epoch in range(num_epochs): for batch_idx, (data, targets) in enumerate(train_loader): # 将数据传递给神经网络进行前向传递 outputs = net(data) # 计算损失函数 loss = F.cross_entropy(outputs, targets) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印训练的进度 if (batch_idx+1) % 100 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Step [{batch_idx+1}/{n_total_steps}], Loss: {loss.item():.4f}') ``` 在训练过程中,我们首先将数据传递给神经网络进行前向传递,并计算损失函数。然后,我们使用反向传播和优化器来更新神经网络的参数。最后,我们打印训练的进度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值