1. 程式人生 > >mxnet 資料介面mx.io.ImageRecordIter中的快取

mxnet 資料介面mx.io.ImageRecordIter中的快取

首先。問題描述:

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的效率高)