天天看點

torch.utils.data.DataLoader與疊代器轉換

在做實驗時,我們常常會使用用開源的資料集進行測試。而Pytorch中内置了許多資料集,這些資料集我們常常使用DataLoader類進行加載。而我們用for語句來周遊DataLoader類的對象時,我們并沒有顯式将Dataloader轉換為疊代器類型。這其實是Python語言for循環的一種機制,一旦我們用for ... in ...句式來疊代一個對象,那麼Python解釋器就會偷偷地自動幫我們建立好疊代器。

在做實驗時,我們常常會使用用開源的資料集進行測試。而Pytorch中内置了許多資料集,這些資料集我們常常使用<code>DataLoader</code>類進行加載。

如下面這個我們使用<code>DataLoader</code>類加載<code>torch.vision</code>中的<code>FashionMNIST</code>資料集。

我們接下來定義<code>Dataloader</code>對象用于加載這兩個資料集:

那麼這個<code>train_dataloader</code>究竟是什麼類型呢?

我們可以将先其轉換為疊代器類型。

然後再使用<code>next(iter(train_dataloader))</code>從疊代器裡取資料,如下所示:

可以看到我們成功擷取了資料集中第一張圖檔的資訊,控制台列印:

圖檔可視化顯示如下:

torch.utils.data.DataLoader與疊代器轉換

不過有讀者可能就會産生疑問,很多時候我們并沒有将<code>DataLoader</code>類型強制轉換成疊代器類型呀,大多數時候我們會寫如下代碼:

可以看到,該代碼也能夠正常疊代訓練資料,前三個樣本的控制台列印輸出為:

那麼為什麼我們這裡沒有顯式将<code>Dataloader</code>轉換為疊代器類型呢,其實是Python語言for循環的一種機制,一旦我們用<code>for ... in ...</code>句式來疊代一個對象,那麼Python解釋器就會偷偷地自動幫我們建立好疊代器,也就是說

實際上等同于

更進一步,這實際上等同于

推而廣之,我們在用Python疊代直接疊代清單時:

其實Python解釋器已經為我們隐式轉換為疊代器了:

[1] https://pytorch.org/

[2] Martelli A, Ravenscroft A, Ascher D. Python cookbook[M]. " O'Reilly Media, Inc.", 2005.

數學是符号的藝術,音樂是上界的語言。