參考:https://pytorch-cn.readthedocs.io/zh/latest/torchvision/torchvision-datasets/python
Datasets
擁有如下API
:多線程
__getitem__
__len__
Datasets
都是 torch.utils.data.Dataset
的子類,因此,他們也能夠經過torch.utils.data.DataLoader
使用多線程(python的多進程)。函數
舉例說明: spa
torch.utils.data.DataLoader(coco_cap, batch_size=args.batchSize, shuffle=True, num_workers=args.nThreads)
在構造函數中,不一樣的數據集直接的構造函數會有些許不一樣,可是他們共同擁有 keyword
參數。線程
transform
: 一個函數,原始圖片做爲輸入,返回一個轉換後的圖片。target_transform
- 一個函數,輸入爲target
,輸出對其的轉換。例子,輸入的是圖片標註的string
,輸出爲word
的索引。一個通用的數據加載器,數據集中的數據以如下方式組織code
root/dog/xxx.png root/dog/xxy.png root/dog/xxz.png root/cat/123.png root/cat/nsdf3.png root/cat/asd932_.png
既其默認你的數據集已經自覺按照要分配的類型分紅了不一樣的文件夾,一種類型的文件夾下面只存放一種類型的圖片orm
運行命令爲:對象
import torchvision.datasets as dset
dset.ImageFolder(root="root folder path", [transform, target_transform])
transform
: 一個函數,原始圖片做爲輸入,返回一個轉換後的圖片。target_transform
- 一個函數,輸入爲target
,輸出對其的轉換。例子,輸入的是圖片標註的string
,輸出爲word
的索引。有如下成員變量:blog
可見分紅了cat和dog兩類索引
import torchvision.datasets as dset dataset = dset.ImageFolder('./data/dogcat_2') #沒有transform,先看看取得的原始圖像數據 print(dataset.classes) #根據分的文件夾的名字來肯定的類別 print(dataset.class_to_idx) #按順序爲這些類別定義索引爲0,1... print(dataset.imgs) #返回從全部文件夾中獲得的圖片的路徑以及其類別
返回:
['cat', 'dog'] {'cat': 0, 'dog': 1} [('./data/dogcat_2/cat/cat.12484.jpg', 0), ('./data/dogcat_2/cat/cat.12485.jpg', 0), ('./data/dogcat_2/cat/cat.12486.jpg', 0), ('./data/dogcat_2/cat/cat.12487.jpg', 0), ('./data/dogcat_2/dog/dog.12496.jpg', 1), ('./data/dogcat_2/dog/dog.12497.jpg', 1), ('./data/dogcat_2/dog/dog.12498.jpg', 1), ('./data/dogcat_2/dog/dog.12499.jpg', 1)]
若是在數據下面又添加了一個類型'others',那麼訪問類型的時候返回的就是:
['cat', 'dog', 'others'] {'cat': 0, 'dog': 1, 'others': 2}
查看獲得的圖片數據:
#從返回結果可見獲得的數據還是PIL Image對象 print(dataset[0]) print(dataset[0][0]) print(dataset[0][1]) #獲得的是類別0,即cat
返回:
(<PIL.Image.Image image mode=RGB size=497x500 at 0x11D99A9B0>, 0) <PIL.Image.Image image mode=RGB size=497x500 at 0x11DD24278> 0
而後定義一個對數據進行處理的transform:
#能夠看出來此時獲得的圖片數據已是處理事後的tensor數據了 print(dataset[0][0]) print(dataset[0][0].size()) #大小也是通過設定後的大小224 print(dataset[0][1]) #獲得的是類別0,即cat
返回:
tensor([[[-0.7412, -0.7490, -0.7725, ..., 0.3176, 0.3412, 0.3725], [-0.7333, -0.7412, -0.7882, ..., 0.3255, 0.3647, 0.4039], [-0.7098, -0.7569, -0.8039, ..., 0.3255, 0.3725, 0.4039], ..., [ 0.3961, 0.3961, 0.4039, ..., 0.2627, 0.2627, 0.2549], [ 0.4196, 0.4039, 0.4118, ..., 0.2549, 0.2392, 0.2314], [ 0.4275, 0.4275, 0.4431, ..., 0.2314, 0.2314, 0.2235]], [[-0.7412, -0.7490, -0.7725, ..., 0.3882, 0.3725, 0.3569], [-0.7333, -0.7412, -0.7882, ..., 0.3961, 0.3961, 0.3882], [-0.7098, -0.7569, -0.8039, ..., 0.3882, 0.4039, 0.3882], ..., [ 0.0431, 0.0510, 0.0667, ..., -0.0824, -0.0824, -0.0902], [ 0.0510, 0.0431, 0.0588, ..., -0.0824, -0.1059, -0.1137], [ 0.0353, 0.0353, 0.0510, ..., -0.0902, -0.1059, -0.1216]], [[-0.8353, -0.8431, -0.8667, ..., 0.3255, 0.3255, 0.3255], [-0.8196, -0.8275, -0.8824, ..., 0.3333, 0.3490, 0.3569], [-0.7804, -0.8353, -0.8667, ..., 0.3333, 0.3569, 0.3569], ..., [-0.2863, -0.2784, -0.2627, ..., -0.3569, -0.3569, -0.3647], [-0.2549, -0.2706, -0.2549, ..., -0.3569, -0.3804, -0.3882], [-0.2235, -0.2471, -0.2392, ..., -0.3569, -0.3804, -0.4039]]]) torch.Size([3, 224, 224]) 0