N: batch;
C: channel
H: height
W: width
Caffe 的Blob通道順序是:NCHW;
Tensorflow的tensor通道順序:默認是NHWC, 也支持NCHW,使用cuDNN會更快;
Pytorch中tensor的通道順序:NCHW
TensorRT中的tensor 通道順序: NCHW
numpy image: H x W x C torch image: C X H X W
目前世面上深度學習框架比較多,常用的有三大類:Caffe、Tensorflow和Pytorch,這三種深度學習框架都主要在英偉達顯卡上面進行訓練和測試,很奇怪的是,它們之間的通道維度順序並沒有保持一致,在多個框架中替換着使用,很容易讓人混淆了,所以做一個小結。
Caffe 的通道順序是NCHW;
Tensorflow的通道順序默認是NHWC(但可以設置成NCHW),NHWC 的訪存局部性更好(每三個輸入像素即可得到一個輸出像素),NCHW 則必須等所有通道輸入准備好才能得到最終輸出結果,需要占用較大的臨時空間。
TensorFlow 為什么選擇 NHWC 格式作為默認格式?因為早期開發都是基於 CPU,使用 NHWC 比 NCHW 稍快一些(不難理解,NHWC 局部性更好,cache 利用率高)。
NCHW 則是 Nvidia cuDNN 默認格式,使用 GPU 加速時用 NCHW 格式速度會更快(也有個別情況例外)。
最佳實踐:設計網絡時充分考慮兩種格式,最好能靈活切換,在 GPU 上訓練時使用 NCHW 格式,在 CPU 上做預測時使用 NHWC 格式。
Pytorch的通道順序是NCHW
參考鏈接:https://blog.csdn.net/edward_zcl/article/details/102661617
原文鏈接:https://blog.csdn.net/u013289254/article/details/105278293
以pytorch為例,注意:
torch.nn
只支持小批量處理(mini-batches)。整個torch.nn
包只支持小批量樣本的輸入,不支持單個樣本的輸入。
比如,nn.Conv2d
接受一個4維的張量,即nSamples x nChannels x Height x Width
如果是一個單獨的樣本,只需要使用input.unsqueeze(0)
來添加一個“假的”批大小維度。