pytroch之數據讀取

圖片數據一般有兩種情況:
1. 所有圖片放在一個文件夾內,另外有一個txt文件顯示標籤。
2. 不同類別的圖片放在不同的文件夾內,文件夾就是圖片的類別。

今天寫貓狗大戰代碼時就遇到了這樣的錯誤,我一直把這兩個概念搞混淆。總是把所有不同類別的圖片放在同一個沒有txt文件顯示標籤的文件夾中。編譯器一直給我報錯找不到文件,但是我按着目錄找又總是能找到文件!!!!糾結

針對這兩種不同的情況,數據集的準備不相同,第一種情況可以自定義一個Dataset,第二種情況直接調用torchvision.datasets.ImageFolder來處理。

所有圖片放在一個文件夾內,另外有一個txt文件顯示標籤。

torch.utils.data.Dataset 是代表這一數據的抽象類,你可以自己定義你的數據類型繼承和重寫這個抽象類,非常簡單,只需要定義_ len __ getitem _這兩個函數即可:

class myDataset(Dataset):
    def __init__(self,csv_file,txt_file,root_dir,other_file):
        self.csv_data = pd.read_csv(csv_file)
        with open(txt_file,'r') as f:
            data_list = f.readlines()
        self.txt_data = data_list
        self.root_dir = root_dir
    def __len__(self):
        return len(self.csv_data)
    def __getitem__(self,idx):
        data = (self.csv_data[idx],self.txt_data[idx])
        return data

通過以上方式,可以定義我們需要的數據類。

不同類別的圖片放在不同的文件夾內,文件夾就是圖片的類別。

在torchvision這個包中還有一個更高級的關於計算機視覺的數據讀取類:ImageFolder,主要功能是處理圖片,但是要求不同類別的圖片放在不同的文件夾內,文件夾就是圖片的類別。如官方給出的格式(不一定是.png,只要是圖片類型都可以):

root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png

root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png

之後按如下方式調用這個類:

dset.ImageFolder(root="root folder path", [transform, target_transform])

最後,通過torch.utils.data.DataLoaderl來定義一個新的迭代器,來實現取batch,shuffle或者是多線程讀數據。

class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=<function default_collate>, pin_memory=False, drop_last=False)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章