Group Normalization


Group Normalization

FAIR 團隊,吳育昕和愷明大大的新作Group Normalization

 

主要的優勢在於,BN會受到batchsize大小的影響。如果batchsize太小,算出的均值和方差就會不准確,如果太大,顯存又可能不夠用。

而GN算的是channel方向每個group的均值和方差,和batchsize沒關系,自然就不受batchsize大小的約束。

從上圖可以看出,隨着batchsize的減小,GN的表現基本不受影響,而BN的性能卻越來越差。

 

BatchNorm基礎:

 

其中u為均值,seigema為方差,實際訓練中使用指數滑動平均EMA計算。

gamma為scale值,beta為shift值

 

BatchNorm:batch方向做歸一化,算N*H*W的均值

LayerNorm:channel方向做歸一化,算C*H*W的均值

InstanceNorm:一個channel內做歸一化,算H*W的均值

GroupNorm:將channel方向分group,然后每個group內做歸一化,算(C//G)*H*W的均值


 

Tensorflow代碼:

[python]  view plain  copy
 
  1. def GroupNorm(x,G=16,eps=1e-5):  
  2.     N,H,W,C=x.shape       
  3.     x=tf.reshape(x,[tf.cast(N,tf.int32),tf.cast(H,tf.int32),tf.cast(W,tf.int32),tf.cast(G,tf.int32),tf.cast(C//G,tf.int32)])  
  4.     mean,var=tf.nn.moments(x,[1,2,4],keep_dims=True)  
  5.     x=(x-mean)/tf.sqrt(var+eps)  
  6.     x=tf.reshape(x,[tf.cast(N,tf.int32),tf.cast(H,tf.int32),tf.cast(W,tf.int32),tf.cast(C,tf.int32)])  
  7.     gamma = tf.Variable(tf.ones(shape=[1,1,1,tf.cast(C,tf.int32)]), name="gamma")  
  8.     beta = tf.Variable(tf.zeros(shape=[1,1,1,tf.cast(C,tf.int32)]), name="beta")  
  9.     return x*gamma+beta  

 

References:

https://www.zhihu.com/question/269576836/answer/348670955

https://github.com/taokong/group_normalization

https://github.com/shaohua0116/Group-Normalization-Tensorflow
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_14845119/article/details/79702040


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM