mxnet 資料介面mx.io.ImageRecordIter中的快取
阿新 • • 發佈:2018-12-19
首先。問題描述:
mx.io.ImageRecordIte獲取資料的介面是next()。
假如用一個迴圈不斷將獲取的資料壓入一個list容器中,那麼你會發現一個奇怪的現象。在幾個步驟之後,list中的內容從前向後會依次開始改變。
程式碼表示:
for batch in range(100):
data_train = next(train_iter)
bag_data.append(data_train)
也就是這個bag_data的【0】中的元素會首先變化。而且會產生一個有規律的變化。可以列印bag_data[0].label[0][0]看規律。
以下是我的列印結果。
原因:
因為next()返回的是一個地址。壓入的時候也是壓入的是地址,相當於我們使用的是淺複製。
但是,這個地址是怎麼產生的。在研究了這個規律和查看了mxnet的api之後,我們得出了一個結論。先說結論,之後再談發現過程。
結論:
mxnet利用的是一個迴圈buffer的形式預快取多個batch的內容,然後迴圈重新整理。所以同一個地址的內容將會不斷的有規律的重新整理。
發現過程:
第一次:不出錯的情況:list的內容,順序儲存。主要看lable的值。(左圖)
第n次:開始第一次重新整理,中間圖。
第n+1次:接下重新整理第二個buffer。右圖。
如圖中所示:
紅色是改變的內容,藍色是不變的內容。
迴圈buffer的示意圖如下:
在api中:
有個引數是prefetch_batch,表示預先讀取幾個buffer的內容。
在列印的內容中,我們也發現,改變的label的間隔確實與prefetch_batch有關。
最後:
如果要存連續的next內容,需要用到深複製。或者就自己寫介面。(但是沒有mxnet的效率高)