Este artículo solo presenta la comprensión de BatchNormalization. Para la parte principal, la información del blog en línea es muy detallada.
1 ¿Qué es la normalización por lotes?
Al realizar el entrenamiento de la red neuronal de imágenes, a menudo alimentamos un lote de datos a la red neuronal cada vez. Por supuesto, estos datos se refieren a imágenes individuales o mapas de características. Por ejemplo, nuestro tamaño de lote = 32, es decir, cada vez que procesamos 32 imágenes o mapa de características. Los datos de este lote no pueden reflejar la distribución del lote. Debe asignarse a un cierto intervalo para reflejar la distribución del conjunto de muestras. En este momento, es necesario usar la normalización para procesar los datos. . Puede consultar la imagen de abajo para entender. Después de usar Normalizatio, puede mantener la distribución de datos básicamente sin cambios. Y Batch_normallization es procesar cada lote.
2 que hace
Su función puede acelerar la velocidad de convergencia del entrenamiento del modelo, hacer que el proceso de entrenamiento del modelo sea más estable y evitar la explosión o la desaparición del gradiente. Y juega un cierto papel de regularizador, casi reemplazando al Dropout.
3 Cómo entender el proceso de BatchNormalization
Usamos una imagen para describir Batch_normalization,
Al realizar operaciones de convolución de imágenes u otras operaciones, la entrada es un dato de tensor de forma 4D (batch_size, channel, height, width) . Lo convertimos en una forma 3D (batch_size, channel, height*width) . Entre ellos, C significa canal, N significa lote, H, w puede entenderse como una matriz de imagen bidimensional (H, W) en una dimensión (H*W).
batch_size: el número de muestras en un lote
canal: el número de canales
altura : la altura de una imagen o mapa de características
ancho: el ancho de una imagen o mapa de características
Se puede ver en la figura anterior que normaliza el mismo canal , diferentes lotes y diferente información de imagen. Puede ver directamente que la parte azul de la imagen está recortada desde la perspectiva del canal .
Por ejemplo
Por ejemplo, el tamaño de una imagen a color es 32*32, tenemos 8 imágenes en un lote, el canal es 3 (es decir, tres canales de RGB), y la forma del tensor es: (8,3,32 ,32) Para tal tensor Los datos están normalizados.
De hecho, es normalizar el canal R, el canal G y el canal B de la imagen respectivamente.
oficial:
Realice una Normalización para cada canal de color.
4 implementación de código
#!/usr/bin/env python
# coding:utf-8
# image = (N,C,H,W)
import torch
import torch.nn as nn
batch_size = 2
channel = 3
height = 32
width = 32
eps = 1e-5
# ======== officcal API =============
# 通道级别
def get_Batch_norm_API(x) :
bn = nn.BatchNorm1d(channel,affine=True)
y = bn(x)
return y,y.shape
# ======= 手动计算batch_norm ===========
def get_Batch_norm(x):
# 求均值
bn_mean = x.mean(dim=(0,2) ,keepdim=True)
# 求标准差
bn_std = x.std(dim=(0,2) ,unbiased=False,keepdim=True )
y = (x-bn_mean) /(bn_std + eps)
return y,y.shape
x = torch.randn((batch_size ,channel ,height*width ))
# 官方的api
bn_api,bn_api_size = get_Batch_norm_API(x)
# 自己的
bn,bn_size = get_Batch_norm(x)
print(bn_api)
print('=================')
print(bn)
print(bn_size)
Cree una red, utilizando la normalización por lotes escrita
#!/usr/bin/env python
# Author: zhanghansen
# Created Time: 2023年03月28日 星期二 14时28分42秒
# coding:utf-8
#
import cv2
import torch
import torch.nn as nn
import numpy as np
import random
seed = 42
torch.cuda.manual_seed(seed) # 为GPU设置种子
torch.cuda.manual_seed_all(seed) # 当有多张GPU时,为所有GPU设置种子
np.random.seed(seed) # 为Numpy设置随机种子
random.seed(seed) #
class Net1(nn.Module):
def __init__(self,shape):
super().__init__()
self.shape = shape
self.in_channel = self.shape[1]
self.out_channel = 16
self.conv1 = nn.Conv2d(self.in_channel,self.out_channel,kernel_size=3)
def forward(self,x) :
x = self.conv1(x)
x = self.batch_norm2(x,x.shape[1])
return x
# normalization
def batch_norm(self,x,channel):
bn = nn.BatchNorm2d(channel,affine=True)
return bn(x)
def batch_norm2(self,x,channel) :
eps = 1e-5
# 均值
bn_mean = x.mean(dim=(0,2,3),keepdim=True)
bn_std = x.std(dim=(0,2,3),unbiased=False ,keepdim=True)
bn = ( x- bn_mean) /( bn_std+eps)
return bn
# 方差
batch_size = 4
in_channel = 3
height = 32
width = 32
input_ = torch.rand((batch_size ,in_channel,height,width))
X = Net1([batch_size,in_channel,height,width])
y = X(input_)
print(y.shape)
Referencia :
Interpretación profunda de Batch Normalization_batchnorm dimension_Soy demasiado difícil...'s blog-CSDN Blog Deep Learning Image Classification (8)--Batch Normalization_batch Image_木邦_THU's Blog-CSDN Blog
Explicación detallada de la normalización por lotes y el experimento pytorch: se busca programador
[Algoritmo básico] Seis preguntas para comprender a fondo BN (normalización por lotes) bzdww