關於bn和relu的相對順序網上的見解不一致,但在resnet、mobilenetv2、detectron2、maskrcnn_benchmark見到的都是conv+bn+relu的順序,沒見過conv+relu+bn的順序,遂感到很疑惑,於是上網上查了一下。
從數據飽和區的角度講有比較好的討論,即如果先進行relu,那么在bn的時候有些單元已經失活了,造成bn不穩定,影響模型性能;bn將數據分布進行標准化,使數據回到非飽和區,然后在經過relu可以控制激活的飽和程度。這里可以假設從conv出來的數據很大部分進入失活,那么先relu再bn的結果就不穩定了。因此應該將置於relu之前。
參考知乎的這個問題,也有提到從實驗效果上看先relu再bn效果會更好一些,因為bn的作用就是對上層的輸出進行歸一化。
個人感覺還是偏向第一種,即conv+relu+bn。如果采用第二種方式,如果效果更好的話應該需要采取措施避免數據再relu之前進入飽和區,最直接的做法就是降低學習率和增大批處理數量。