Normalización por lotes

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

https://www.cnblogs.com/wevolf/p/15195143.html

Supongo que te gusta

Origin blog.csdn.net/qq_41661809/article/details/129811811
Recomendado
Clasificación