數據集下載地址:
鏈接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw
提取碼:2xq4
創建數據集:https://www.cnblogs.com/xiximayou/p/12398285.html
讀取數據集:https://www.cnblogs.com/xiximayou/p/12422827.html
進行訓練:https://www.cnblogs.com/xiximayou/p/12448300.html
保存模型並繼續進行訓練:https://www.cnblogs.com/xiximayou/p/12452624.html
加載保存的模型並測試:https://www.cnblogs.com/xiximayou/p/12459499.html
划分驗證集並邊訓練邊驗證:https://www.cnblogs.com/xiximayou/p/12464738.html
使用學習率衰減策略並邊訓練邊測試:https://www.cnblogs.com/xiximayou/p/12468010.html
利用tensorboard可視化訓練和測試過程:https://www.cnblogs.com/xiximayou/p/12482573.html
從命令行接收參數:https://www.cnblogs.com/xiximayou/p/12488662.html
使用top1和top5准確率來衡量模型:https://www.cnblogs.com/xiximayou/p/12489069.html
使用預訓練的resnet18模型:https://www.cnblogs.com/xiximayou/p/12504579.html
計算數據集的平均值和方差:https://www.cnblogs.com/xiximayou/p/12507149.html
epoch、batchsize、step之間的關系:https://www.cnblogs.com/xiximayou/p/12405485.html
pytorch讀取數據集有兩種方式,本節介紹第二種方式。
存儲數據集的目錄結構是:
首先,我們需要將圖片的路徑和標簽存儲到txt文件中,在utils下新建一個Img_to_txt.py文件
import os from glob import glob root="/content/drive/My Drive/colab notebooks/data/dogcat/" train_path=root+"train" val_path=root+"val" test_path=root+"test" def img_to_txt(path): tmp=path.strip().split("/")[-1] filename=tmp+".txt" with open(filename,'a',encoding="utf-8") as fp: i=0 for f in sorted(os.listdir(path)): for image in glob(path+"/"+str(f)+"/*.jpg"): fp.write(image+" "+str(i)+"\n") i+=1 img_to_txt(train_path) #img_to_txt(val_path)#img_to_txt(test_path)
其中os.listdir()用於獲取路徑下的文件夾列表,['cat','dog']。glob()用於獲取目錄下的所有匹配的文件。為了能夠按順序對類別進行數字標記,需要對目錄列表進行排序。然后我們將cat標記為0,dog標記為1。並將圖片對應的路徑和標簽加入到txt中。
運行之后得到類似的結果:
然后我們要實現自己定義的數據集類,需要繼承Dataset類,並重寫__getitem__()和__len__()方法 :在utils下新建一個read_from_txt.py文件
from torch.utils.data import Dataset from PIL import Image class Dogcat(Dataset): def __init__(self,txt_path,transform=None,target_transform=None): super(Dogcat,self).__init__() self.txt_path=txt_path self.transform=transform self.target_transform=target_transform fp=open(txt_path,'r') imgs=[] for line in fp: line=line.strip().split() #print(line) img=line[0]+" "+line[1]+" "+line[2] #['/content/drive/My', 'Drive/colab', 'notebooks/data/dogcat/train/cat/cat.9997.jpg', '0'] #imgs.append((line[0],int(line[-1]))) imgs.append((img,int(line[-1]))) self.imgs=imgs def __getitem__(self,index): image,label=self.imgs[index] image=Image.open(image).convert('RGB') if self.transform is not None: image=self.transform(image) return image,label def __len__(self): return len(self.imgs)
由於我們的路徑中含有空格,在截取圖像的路徑和標簽時需要注意。
之后在rdata.py中
from torch.utils.data import DataLoader import torchvision import torchvision.transforms as transforms import torch from utils import read_from_txt def load_dataset_from_dataset(batch_size): #預處理 print(batch_size) train_transform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.ToTensor()]) val_transform = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor()]) test_transform = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor()]) root="/content/drive/My Drive/colab notebooks/utils/" train_loader = DataLoader(read_from_txt.Dogcat(root+"train.txt",train_transform), batch_size=batch_size, shuffle=True, num_workers=6) val_loader = DataLoader(read_from_txt.Dogcat(root+"val.txt",val_transform), batch_size=batch_size, shuffle=True, num_workers=6) test_loader = DataLoader(read_from_txt.Dogcat(root+"test.txt",test_transform), batch_size=batch_size, shuffle=True, num_workers=6) return train_loader,val_loader,test_loader
然后在main.py中就可以使用了。
train_loader,val_loader,test_loader=rdata.load_dataset_from_dataset(batch_size)
報錯了查看下train.txt發現有重復命名的文件,將這些重復的文件進行刪除。
最后運行:
最后到這報錯了:
圖像地址都還沒讀取完畢就加入到DataLoader中了?線程不安全?還未找到解決方法。不過總體上創建數據集的過程就是這樣的。