深入淺出理解EdgeBoard中NHWC資料格式
摘要:
在深度學習中,為了提升資料傳輸頻寬和計算效能,經常會使用NCHW、NHWC和CHWN資料格式,它們代表Image或Feature Map等的邏輯資料格式(可以簡單理解為資料在記憶體中的存放順序)。本文以百度的AI端上推理裝置EdgeBoard為原型,介紹EdgeBoard選擇NHWC資料格式的技術考量。
EdgeBoard簡介
EdgeBoard是百度基於FPGA晶片研發的嵌入式AI解決方案,高效能的加速引擎可提供3.6Tops的強大算力,完整的嵌入式參考設計使硬體整合輕鬆便捷。目前EdgeBoard提供了FPGA軟核和計算卡模組兩種形態供硬體整合,面向專案部署也提供了抓拍機和計算盒兩種基礎硬體產品。EdgeBoard深度相容百度大腦模型資源與工具平臺(EasyDL/AI Studio),極大降低了開發驗證、產品整合、科研教學、專案部署門檻,適用於安防監控、工業質檢、醫療診斷、農作物生長監控、無人駕駛、無人零售等場景
資料格式的邏輯表示與物理表示
深度學習中經常會使用NCHW、NHWC和CHWN資料格式來表示資料,其中N、H、W、C定義如下:
N:一個batch內圖片的數量,一次處理的圖片數量
H:垂直高度方向的畫素個數,圖片的高
W:水平寬度方向的畫素個數,圖片的寬
C:通道數。例如灰度影象為1, 彩色RGB影象為3
下圖表示N=2,C=16,H=5,W=4的資料排列,其中左圖是邏輯表示,右圖是物理表示。
以NCHW為例,其邏輯表示如左上圖,n=0時,三個座標分別標識了C、H、W的方向。第一個元素是000,第二個元素沿著w方向,即001,隨後是002, 003;然後沿H方向,即004, 005, 006, 007...如此反覆到019後;再沿C方向,020,021, 022 .....一直到319;再沿N方向,也就是n=1,然後重複W方向,H方向和C方向。
根據以上NCHW的劃分,實體地址表示定義如下(如右上圖):
[a:0] 表示W方向,在一行內從左到右
[a:1] 表示從H方向,一行一行的從上到下
[a:2] 表示在C方向,從一個通道到另外一個通道
[a:3] 表示從N方向,從n=0 到n=1
最終NCHW資料格式的物理分佈(在記憶體中的一維表示)表示為000 001 002 003 004 ... 018 019 020 ... 318 319 320 ... ... 637 638 639。可以理解成把一個通道的所有畫素一行一行地排列起來,然後排下一個通道,即n=0排列完後再排n=1。
同理NHWC表示是先沿C方向,再沿W方向,再沿H方向,最後沿N方向。所以在記憶體的存放順序是,第一個元素是000,第二個沿C方向,即020,040, 060 ...一直到300,之後切換到W方向,001 021 041 061...301..到了303後再切換到H方向,即004, 024 ... 304,最後到了319,再切換到N方向,320,340 ...一直到639。
[b:0] 表示C方向,第一個畫素從一個通道到另外一個通道
[b:1] 表示從W方向,最後一個通道第一個畫素回到第一個通道的第二個畫素
[b:2] 表示在H方向,最後一個通道第一行最後一個畫素回到第一個通道的第二行的第一個畫素
[b:3] 表示從N方向,從n=0 到n=1
NHWC其物理表示為000 020 ... 300 001 021 ... 283 303 004 ... 319 320 340 ... ... 339 359 ... 639。可以理解成把一個batch的一個畫素的所有通道先排列起來,然後排下一個畫素。n=0排列完成後,再排n=1。
同理CHWN其邏輯表示,先沿N方向,再沿W方向,再沿H方向,最後是沿C方向。
[c:0] 表示從N方向,從n=0的第一個畫素到n=1的第一個畫素
[c:1] 表示從N方向,從n=1的第一個畫素回到n=0的第二個畫素
[c:2] 表示在H方向,從n=1的第一行最後一個畫素回到n=0的第二行第一個畫素
[c:3] 表示從N方向,從n=1的第一個通道最後一個畫素回到n=0的第二個通道第一個畫素
CHWN其物理表示為 000 032 001 321 ... 003 323 004 324 ... ... 019 339 020 ...。可以理解成先把一個batch中N幅影象的第一個通道第一個畫素排列起來,然後排第二個畫素;再排第二個通道,第三個通道...
資料在記憶體中的偏移地址
深度學習中涉及大量的資料計算,計算需要從記憶體中取出資料,因此需要計算出資料的偏移地址以便進行取數。有了上面的邏輯表示和物理表示,可以推匯出4維邏輯表示(n,c,h,w)對映到一維記憶體中偏移地址的公式。
定義位置(n,c,h,w)表示第n個batch的第c通道的第h行的第w列,那麼該位置在不同資料格式下,在記憶體中的偏移地址計算公式如下: NCHW: offset_nchw(n, c, h, w) = n * CHW + c * HW + h * W + w NHWC: offset_nhwc(n, c, h, w) = n * HWC + h * WC + w * C + c CHWN: offset_chwn(n, c, h, w) = c * HWN + h * WN + w * N + n 其中N、C、H、W為常量,n、c、h、w為變數
在NCHW中,CHW=C*H*W,表示一個Batch,可以理解成一個BGR 3通道的圖片,表達的是一個立方體。HW=H*W,表示一個平面,可以理解成是BGR 3通道圖片的一個通道(灰度圖就是一個通道圖片)。W是一行,可以理解成一個通道上的一行。
以上圖為例,如果想計算出綠色圈,即341的位置(n=1,c=1, h=0, w=1)。我們需要先跳過n=0的資料(CHW),圖中箭頭1指向的藍色框區域;再跳過n=1的第一個通道(HW),圖中箭頭2指向藍色框區域;這時進入到了n=1的第二個通道,跳過h=0行(0*W);最後跳過w個數到達偏移位置。
EdgeBoard為何使用NHWC
下面來分析EdgeBoard選擇NHWC資料格式的原因。
上圖表示卷積的計算過程。根據卷積的運算特點,相同位置視窗所有通道數與卷積的引數相乘後累加,可以有下面兩種計算方式:
先通道後像素:先把一個畫素點的所有通道數與卷積的引數相乘後累加,再進行下一個畫素,直到卷積核視窗乘累加完成。比如第一次滑窗的計算公式 (w0,0,0)*(x0,0,0) + (w1,0,0)*(x1,0,0) + (w2,0,0)*(x2,0,0) + (w0,0,1)*(x0,0,1) + (w1,0,1)*(x1,0,1) + (w2,0,1)*(x2,0,1) + (w0,0,2)*(x0,0,2) + (w1,0,1)*(x1,0,2) + (w2,0,2)*(x2,0,2) + (w0,1,0)*(x0,1,0) + (w1,1,0)*(x1,1,0) + (w2,1,0)*(x2,1,0) + (w0,1,1)*(x0,1,1) + (w1,1,1)*(x1,1,1) + (w2,1,1)*(x2,1,1) + (w0,1,2)*(x0,1,2) + (w1,1,1)*(x1,1,2) + (w2,1,2)*(x2,1,2) + (w0,2,0)*(x0,2,0) + (w1,2,0)*(x1,2,0) + (w2,2,0)*(x2,2,0) + (w0,2,1)*(x0,2,1) + (w1,2,1)*(x1,2,1) + (w2,2,1)*(x2,2,1) + (w0,2,2)*(x0,2,2) + (w1,2,1)*(x1,2,2) + (w2,2,2)*(x2,2,2) = 0*-1 + 0*-1 + 0*0 + 0*1 + 0*-1 + 0*0 + 0*0 + 0*0 + 0*-1 + 0*0 + 0*0 + 0*0 + 0*1 + 1*0 + 2*1 + 1*0 + 0*0 +1*0 + 0*0 + 0*0 + 0*1 + 2*1 + 0*-1 + 1*-1 + 2*1 + 0*0 + 0*-1 + = 5
先畫素後通道:先把一個通道滑動視窗與卷積引數相乘後累加,再進行下一個通道,直到所有通道乘累加完成。比如第一次滑窗計算公式
(w0,0,0)*(x0,0,0) + (w0,0,1)*(x0,0,1) + (w0,0,2)*(x0,0,2) + (w0,1,0)*(x0,1,0) + (w0,1,1)*(x0,1,1) + (w0,0,2)*(x0,1,2) + (w0,2,0)*(x0,2,0) + (w0,0,1)*(x0,2,1) + (w0,0,2)*(x0,2,2) + (w1,0,0)*(x1,0,0) + (w1,0,1)*(x1,0,1) + (w1,0,2)*(x1,0,2) + (w1,1,0)*(x1,1,0) + (w1,1,1)*(x1,1,1) + (w1,0,2)*(x1,1,2) + (w1,2,0)*(x1,2,0) + (w1,0,1)*(x1,2,1) + (w1,0,2)*(x1,2,2) + (w2,0,0)*(x2,0,0) + (w2,0,1)*(x2,0,1) + (w2,0,2)*(x2,0,2) + (w2,1,0)*(x2,1,0) + (w2,1,1)*(x2,1,1) + (w2,0,2)*(x2,1,2) + (w2,2,0)*(x2,2,0) + (w2,0,1)*(x2,2,1) + (w2,0,2)*(x2,2,2) = 0*-1 + 0*1 + 0*0 + 0*0 +0*1 + 1*0 + 0*0 + 2*1 + 2*1 + 0*-1 + 0*-1 + 0*0 + 0*0 + 1*0 + 0*0 + 0*0 + 0*-1 + 0*0 + 0*0 + 0*0 + 0*-1 + 0*0 + 2*1 + 1*0 + 0*1 + 1*-1 + 0*-1 = 5
可以看出兩種方式計算的結果是一樣。
而對於NHWC格式,即先通道後像素,是把一個畫素的所有通道的資料放在一起。這樣對應上圖第一個畫素的3個通道值,第二個畫素的3個通道值,第三個畫素的3個通道值,它們在記憶體中的地址都是連續的,也就是說一次就可以把kernel第一行需要計算的數取出,3x3的kernel需要3次取數。
而對於NCHW格式,即先畫素後通道,是把一個通道的所有畫素按順序排列,這樣對於一個3*3的卷積核,需要每取3個數就需要跳躍n個數後,再取3個數。一個通道需要取3次,3個通道需要取9次。
在實際網路中,通常通道數會遠大於卷積kernel數(不會像上圖只有3個通道,通常是幾十、幾百個通道)。這樣對於NHWC格式來說說,取數的次數會比NCHW少很多。對EdgeBoard來說,為了增加其所支援網路的廣泛性,減少對大輸入尺寸和高儲存量權重網路的限制,採用NHWC的格式可以實現分批次地把Feature Map和Weight資料讀取到FPGA的片上快取,例如對於3x3的Kernel,我們可以只讀取三行(3WC)Feature Map的資料到FPGA內進行計算,即可得到一行輸出資料,並傳輸到片外大容量快取DDR,而不需依賴下一個3WC的Feature Map輸入資料就可完成每一批次的輸入輸出資料傳輸。
再例如,我們也可將Weight資料根據FPGA片上快取的不同大小分割成N份,一份一份傳送到FPGA分別做卷積運算後,再傳輸回DDR做相應拼接,這等同於做一次大的卷積運算,好處在於可以根據不同容量的FPGA器件做不同匹配,大大提高了程式碼的硬體適配性。此外,由於C維度之間資料相關性較弱,採用NHWC格式更能發揮FPGA高並行度的計算特點,充分利用FPGA的算力。
下表為EdgeBoard使用NHWC資料格式的網路效能:
參考連結:
[1] Intel MKL github
https://intel.github.io/mkl-dnn/understanding_memory_formats.html
[2] 零基礎入門深度學習
https://www.zybuluo.com/hanbingtao/note/485480
福利
據可靠訊息:EdgeBoard正在打折中,歷史最低價,直降1000元,有興趣可以看看:https://aim.baidu.com/product/5b8d8817-9141-4cfc-ae58-640e2815dfd4
EdgeBoard簡介
EdgeBoard是百度基於FPGA晶片研發的嵌入式AI解決方案,高效能的加速引擎可提供3.6Tops的強大算力,完整的嵌入式參考設計使硬體整合輕鬆便捷。目前EdgeBoard提供了FPGA軟核和計算卡模組兩種形態供硬體整合,面向專案部署也提供了抓拍機和計算盒兩種基礎硬體產品。 EdgeBoard深度相容百度大腦模型資源與工具平臺(EasyDL/AI Studio),極大降低了開發驗證、產品整合、科研教學、專案部署門檻,適用於安防監控、工業質檢、醫療診斷、農作物生長監控、無人駕駛、無人零售等場景。
資料格式的邏輯表示與物理表示
深度學習中經常會使用NCHW、NHWC和CHWN資料格式來表示資料,其中N、H、W、C定義如下:
l N:一個batch內圖片的數量,一次處理的圖片數量。
l H:垂直高度方向的畫素個數,圖片的高。
l W:水平寬度方向的畫素個數,圖片的寬。
l C:通道數。例如灰度影象為1, 彩色RGB影象為3。
下圖表示N=2,C=16,H=5,W=4的資料排列,其中左圖是邏輯表示,右圖是物理表示。
以NCHW為例,其邏輯表示如左上圖,n=0時,三個座標分別標識了C、H、W的方向。第一個元素是000,第二個元素沿著w方向,即001,隨後是002, 003;然後沿H方向,即004, 005, 006, 007...如此反覆到019後;再沿C方向,020,021, 022 .....一直到319;再沿N方向,也就是n=1,然後重複W方向,H方向和C方向。
根據以上NCHW的劃分,實體地址表示定義如下(如右上圖):
l [a:0] 表示W方向,在一行內從左到右。
l [a:1] 表示從H方向,一行一行的從上到下。
l [a:2] 表示在C方向,從一個通道到另外一個通道。
l [a:3] 表示從N方向,從n=0 到n=1。
最終NCHW資料格式的物理分佈(在記憶體中的一維表示)表示為000 001 002 003 004 ... 018 019 020 ... 318 319 320 ... ... 637 638 639。可以理解成把一個通道的所有畫素一行一行地排列起來,然後排下一個通道,即n=0排列完後再排n=1。
同理NHWC表示是先沿C方向,再沿W方向,再沿H方向,最後沿N方向。所以在記憶體的存放順序是,第一個元素是000,第二個沿C方向,即020,040, 060 ...一直到300,之後切換到W方向,001 021 041 061...301..到了303後再切換到H方向,即004, 024 ... 304,最後到了319,再切換到N方向,320,340 ...一直到639。
l [b:0] 表示C方向,第一個畫素從一個通道到另外一個通道。
l [b:1] 表示從W方向,最後一個通道第一個畫素回到第一個通道的第二個畫素。
l [b:2] 表示在H方向,最後一個通道第一行最後一個畫素回到第一個通道的第二行的第一個畫素。
l [b:3] 表示從N方向,從n=0 到n=1。
NHWC其物理表示為000 020 ... 300 001 021 ... 283 303 004 ... 319 320 340 ... ... 339 359 ... 639。可以理解成把一個batch的一個畫素的所有通道先排列起來,然後排下一個畫素。n=0排列完成後,再排n=1。
同理CHWN其邏輯表示,先沿N方向,再沿W方向,再沿H方向,最後是沿C方向。
l [c:0] 表示從N方向,從n=0的第一個畫素到n=1的第一個畫素。
l [c:1] 表示從N方向,從n=1的第一個畫素回到n=0的第二個畫素。
l [c:2] 表示在H方向,從n=1的第一行最後一個畫素回到n=0的第二行第一個畫素。
l [c:3] 表示從N方向,從n=1的第一個通道最後一個畫素回到n=0的第二個通道第一個畫素。
CHWN其物理表示為 000 032 001 321 ... 003 323 004 324 ... ... 019 339 020 ...。可以理解成先把一個batch中N幅影象的第一個通道第一個畫素排列起來,然後排第二個畫素;再排第二個通道,第三個通道...
資料在記憶體中的偏移地址
深度學習中涉及大量的資料計算,計算需要從記憶體中取出資料,因此需要計算出資料的偏移地址以便進行取數。有了上面的邏輯表示和物理表示,可以推匯出4維邏輯表示(n,c,h,w)對映到一維記憶體中偏移地址的公式。
定義位置(n,c,h,w)表示第n個batch的第c通道的第h行的第w列,那麼該位置在不同資料格式下,在記憶體中的偏移地址計算公式如下: NCHW: offset_nchw(n, c, h, w) = n * CHW + c * HW + h * W + w NHWC: offset_nhwc(n, c, h, w) = n * HWC + h * WC + w * C + c CHWN: offset_chwn(n, c, h, w) = c * HWN + h * WN + w * N + n 其中N、C、H、W為常量,n、c、h、w為變數。
在NCHW中,CHW=C*H*W,表示一個Batch,可以理解成一個BGR 3通道的圖片,表達的是一個立方體。HW=H*W,表示一個平面,可以理解成是BGR 3通道圖片的一個通道(灰度圖就是一個通道圖片)。W是一行,可以理解成一個通道上的一行。
以上圖為例,如果想計算出綠色圈,即341的位置(n=1,c=1, h=0, w=1)。我們需要先跳過n=0的資料(CHW),圖中箭頭1指向的藍色框區域;再跳過n=1的第一個通道(HW),圖中箭頭2指向藍色框區域;這時進入到了n=1的第二個通道,跳過h=0行(0*W);最後跳過w個數到達偏移位置。
EdgeBoard為何使用NHWC
下面來分析EdgeBoard選擇NHWC資料格式的原因。
上圖表示卷積的計算過程。根據卷積的運算特點,相同位置視窗所有通道數與卷積的引數相乘後累加,可以有下面兩種計算方式:
· 先通道後像素:先把一個畫素點的所有通道數與卷積的引數相乘後累加,再進行下一個畫素,直到卷積核視窗乘累加完成。比如第一次滑窗的計算公式: (w0,0,0)*(x0,0,0) + (w1,0,0)*(x1,0,0) + (w2,0,0)*(x2,0,0) + (w0,0,1)*(x0,0,1) + (w1,0,1)*(x1,0,1) + (w2,0,1)*(x2,0,1) + (w0,0,2)*(x0,0,2) + (w1,0,1)*(x1,0,2) + (w2,0,2)*(x2,0,2) + (w0,1,0)*(x0,1,0) + (w1,1,0)*(x1,1,0) + (w2,1,0)*(x2,1,0) + (w0,1,1)*(x0,1,1) + (w1,1,1)*(x1,1,1) + (w2,1,1)*(x2,1,1) + (w0,1,2)*(x0,1,2) + (w1,1,1)*(x1,1,2) + (w2,1,2)*(x2,1,2) + (w0,2,0)*(x0,2,0) + (w1,2,0)*(x1,2,0) + (w2,2,0)*(x2,2,0) + (w0,2,1)*(x0,2,1) + (w1,2,1)*(x1,2,1) + (w2,2,1)*(x2,2,1) + (w0,2,2)*(x0,2,2) + (w1,2,1)*(x1,2,2) + (w2,2,2)*(x2,2,2) = 0*-1 + 0*-1 + 0*0 + 0*1 + 0*-1 + 0*0 + 0*0 + 0*0 + 0*-1 + 0*0 + 0*0 + 0*0 + 0*1 + 1*0 + 2*1 + 1*0 + 0*0 +1*0 + 0*0 + 0*0 + 0*1 + 2*1 + 0*-1 + 1*-1 + 2*1 + 0*0 + 0*-1 + = 5
· 先畫素後通道:先把一個通道滑動視窗與卷積引數相乘後累加,再進行下一個通道,直到所有通道乘累加完成。比如第一次滑窗計算公式:
(w0,0,0)*(x0,0,0) + (w0,0,1)*(x0,0,1) + (w0,0,2)*(x0,0,2) + (w0,1,0)*(x0,1,0) + (w0,1,1)*(x0,1,1) + (w0,0,2)*(x0,1,2) + (w0,2,0)*(x0,2,0) + (w0,0,1)*(x0,2,1) + (w0,0,2)*(x0,2,2) + (w1,0,0)*(x1,0,0) + (w1,0,1)*(x1,0,1) + (w1,0,2)*(x1,0,2) + (w1,1,0)*(x1,1,0) + (w1,1,1)*(x1,1,1) + (w1,0,2)*(x1,1,2) + (w1,2,0)*(x1,2,0) + (w1,0,1)*(x1,2,1) + (w1,0,2)*(x1,2,2) + (w2,0,0)*(x2,0,0) + (w2,0,1)*(x2,0,1) + (w2,0,2)*(x2,0,2) + (w2,1,0)*(x2,1,0) + (w2,1,1)*(x2,1,1) + (w2,0,2)*(x2,1,2) + (w2,2,0)*(x2,2,0) + (w2,0,1)*(x2,2,1) + (w2,0,2)*(x2,2,2) = 0*-1 + 0*1 + 0*0 + 0*0 +0*1 + 1*0 + 0*0 + 2*1 + 2*1 + 0*-1 + 0*-1 + 0*0 + 0*0 + 1*0 + 0*0 + 0*0 + 0*-1 + 0*0 + 0*0 + 0*0 + 0*-1 + 0*0 + 2*1 + 1*0 + 0*1 + 1*-1 + 0*-1 = 5
可以看出兩種方式計算的結果是一樣。
而對於NHWC格式,即先通道後像素,是把一個畫素的所有通道的資料放在一起。這樣對應上圖第一個畫素的3個通道值,第二個畫素的3個通道值,第三個畫素的3個通道值,它們在記憶體中的地址都是連續的,也就是說一次就可以把kernel第一行需要計算的數取出,3x3的kernel需要3次取數。
而對於NCHW格式,即先畫素後通道,是把一個通道的所有畫素按順序排列,這樣對於一個3*3的卷積核,需要每取3個數就需要跳躍n個數後,再取3個數。一個通道需要取3次,3個通道需要取9次。
在實際網路中,通常通道數會遠大於卷積kernel數(不會像上圖只有3個通道,通常是幾十、幾百個通道)。這樣對於NHWC格式來說說,取數的次數會比NCHW少很多。對EdgeBoard來說,為了增加其所支援網路的廣泛性,減少對大輸入尺寸和高儲存量權重網路的限制,採用NHWC的格式可以實現分批次地把Feature Map和Weight資料讀取到FPGA的片上快取,例如對於3x3的Kernel,我們可以只讀取三行(3WC)Feature Map的資料到FPGA內進行計算,即可得到一行輸出資料,並傳輸到片外大容量快取DDR,而不需依賴下一個3WC的Feature Map輸入資料就可完成每一批次的輸入輸出資料傳輸。
再例如,我們也可將Weight資料根據FPGA片上快取的不同大小分割成N份,一份一份傳送到FPGA分別做卷積運算後,再傳輸回DDR做相應拼接,這等同於做一次大的卷積運算,好處在於可以根據不同容量的FPGA器件做不同匹配,大大提高了程式碼的硬體適配性。此外,由於C維度之間資料相關性較弱,採用NHWC格式更能發揮FPGA高並行度的計算特點,充分利用FPGA的算力。
下表為EdgeBoard使用NHWC資料格式的網路效能:
網路 |
輸入尺寸 |
單幀耗時 |
resnet50 |
224 x 224 |
19ms |
resnet101 |
224 x 224 |
33ms |
mobilenet-v1 |
224 x 224 |
5ms |
vgg-ssd |
300 x 300 |
89ms |
inception-v2 |
299 x 299 |
19ms |
inception-v3 |
299 x 299 |
31ms |
inception-v4 |
299 x 299 |
61ms |
mobilenet-ssd |
224 x 224 |
21ms |
mobilenet-ssd-640 |
640 x 640 |
59ms |
yolo-v3 |
416 x 416 |
98ms |
福利
據可靠訊息:EdgeBoard正在打折中,歷史最低價,直降1000元,有興趣可以看看:https://aim.baidu.com/product/5b8d8817-9141-4cfc-ae58-640e2815dfd4
參考連結:
[1] Intel MKL github
相關推薦
深入淺出理解EdgeBoard中NHWC資料格式
摘要: 在深度學習中,為了提升資料傳輸頻寬和計算效能,經常會使用NCHW、NHWC和CHWN資料格式,它們代表Image或Feature Map等的邏輯資料格式(可以簡單理解為資料在記憶體中的存放順序)。本文以百度的AI端上推理裝置EdgeBoard為原型,介紹EdgeBoard選擇NHWC資料格式的技術
Python中yaml資料格式的使用
最近在看程式碼時發現有人用Yaml —— Yet Another Markup Language :另一種標記語言。程式設計免不了要寫配置檔案,怎麼寫配置也是一門學問。YAML 是專門用來寫配置檔案的語言,非常簡潔和強大,遠比 JSON 格式方便。 YAML在python語言中有PyYAML
Windows Caffe中MNIST資料格式轉換實現
Caffe原始碼中src/caffe/caffe/examples/mnist/convert_mnist_data.cpp提供的實現程式碼並不能直接在Windows下執行,這裡在原始碼的基礎上進行了改寫,使其可以直接在Windows 64位上直接執行,改寫程式碼如下:#inc
資料科學 IPython 筆記本 9.3 理解 Python 中的資料型別
9.3 理解 Python 中的資料型別 本節是《Python 資料科學手冊》(Python Data Science Handbook)的摘錄。 譯者:飛龍 協議:CC BY-NC-SA 4.0 資料驅動的科學和有效計算需要了解資料的儲存和操作方式。本節概
C#基礎資料型別與位元組陣列(記憶體中的資料格式)相互轉換(BitConverter 類)
在某種通訊協議中(如 Modbus),可能需要把一些基本的資料型別記憶體中的表示形式轉換成以位元組陣列的形式,方便傳送。C/C++中可以利用指標等操作完成,但C#中沒有指標,咋辦呢?可以用BitConverter類啊。 1,把double型別轉換成byte陣列,float型別的話,在1234.5678後加
關於pyhton中的__xxx__格式的方法與變量的理解
imp fault 初始化 **kwargs tor rep style ear dir() python中類似__xx__的方法和變量是python系統內定義的方法和變量,都是具有特殊意義的基礎變量和方法,一般不要擅自使用,除非知道自己在幹什麽。 具體查看python內置
MATLAB轉換TXT中灰度值資料格式,將灰度資料輸出為影象
在整理地圖測繪資料時,需要將資料先匯出,然後將資料轉化為影象資訊,使用MATLAB進行轉化遇到點問題,最後算是能出影象了,就將這一點經驗分享下。 首先看下匯出來的資料格式,匯出來的為TXT格式,其中橢圓是有效資料, 但是這種資料比較格魯的一點是,輸出的資料是40*400的
Servlet如何獲取ajax中以json格式傳入的資料
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
js中從json格式資料中獲取特定物件
寫個方法獲取: function getJsonValue(obj,name){ var result = null; var value = null; for(var key in obj){ valu
MySQL中資料格式轉換
MySQL 的CAST()和CONVERT()函式可用來獲取一個型別的值,併產生另一個型別的值。具體用法如下: CAST(value as type); CONVERT(value, 
判斷記憶體中的資料塊是否是合法的jpg或png格式的資料。
實現這個功能需要imageHelper.h imageHelper.cpp這兩個原始碼檔案 imageHelper.h #ifndef _IMAGE_HELPER_H_ #define _IMAGE_HELPER_H_ /* Title: Image Helper Author: kagu
如何理解資料科學的中的資料洩露(Data Leakage)
資料科學競賽中有時會出現這樣的奇特景觀:某隻隊伍,靠著對極個別feature的充分利用,立即將對手超越,成功霸佔冠軍位置,而且與第二名的差距遠超第二名與第十名的差距。然而,這些feature卻不是在因果關係上順利解釋預測值的‘因’,反而是預測值的‘果’。 1. Data Leakage定義
oracle中的日期型別的資料格式
-------------------------------------------------------------------------------------------------------------------------------------------------------
OpenCV中IplImage影象格式與BYTE影象資料的轉換
OpenCV中IplImage影象格式與BYTE影象資料的轉換 IplImage* iplImage; BYTE* data; 1 由IplImage*得到BYTE*影象資料: data = iplImage->imageDataOrigin; //未對齊的原始影象資
protobuf中資料格式與型別
訊息格式 訊息由至少一個欄位組合而成,類似於C語言中的結構體,每個欄位都有一定的格式: 資料型別 欄位名稱 = 唯一的編號標籤值; 欄位名稱:protobuf建議以下劃線命名而非駝峰式 唯一的編號標籤:代表每個欄位的一個唯一的編號標籤,在同一個訊息裡不可以重複。這些編號標籤用與在訊息
怎樣將瀏覽器中的資料儲存成csv格式檔案
在學習神經網路的程式設計的過程中,準備訓練網路的資料是一項不可缺少的工作,很多資料需要從網路上下載,並且還要將下載的資料儲存成可以方便使用的格式。在學習python神經網路程式設計的過程中,訓練手寫數字圖片的資料需要從網路上下載後使用,下載的網址: 該網址並沒有以檔案下
深入淺出地,徹徹底底地理解python中的編碼
python處理文字的功能非常強大,但是如果是初學者,沒有搞清楚python中的編碼機制,也經常會遇到亂碼或者decode error。本文的目的是簡明扼要地說明python的編碼機制,並給出一些建議。 問題1:問題在哪裡? 問題是我們的靶子,心中沒有問題去學習就會抓不住
robot中使用evaluate轉化資料格式
如果你使用robot卻沒有用過evaluate,那你將永遠禁錮在框架中。 json物件格式入參可以使用字典格式直接傳入,但最近有一個介面測試的入參是一個json陣列,在傳參時總是提示請求引數不合法, 使用create dictionary構造資料時又會給陣列加上引號,這樣肯定不能正常傳參
C#中對於json格式資料的處理
基本環境 vs2013 .NetFramework4.5 名稱空間:using Newtonsoft.Json.Linq Json字串不知道key值如何獲得value //假設瀏覽器返回的資料如下: string response={"672":
從資料庫中匯出資料成Dataframe格式兩種方法效率比較
方法1: import pymysql import pandas as pd import time import xlrd first = time.time() #在資料庫中操作150s,在python中操作320s #方法1 con = pymysql.connect(host="