在我剛剛學習深度學習的時候,就只會用現有的數據集。當我想訓練直接的模型的時候,卻不知道該怎樣弄,但時是花了兩天在網上尋找教程,可是都不太適合新手學習,所以今天我就來總結一下pytorch裏面加載自己的數據集的方法。
方法一:利用torch.utils.data.TensorDataset,也是我認爲最簡單的方法
from torch.utils.data import TensorDataset,DataLoader
x = #對應你加載的數據 是tensor類型
y = #對應你數據的標籤 是tensor類型
data_set = TensorDataset(x,y)
data_loader = DataLoader(data_set,batch_size = 100,shuffle = True,drop_last = True) #生成可迭代的迭代器
#訓練時
for index (img,label) in enumerate(data_loaer):
#訓練代碼
方法二:重寫Dataset類
from torch.utils.data import Dataset,DataLoader
class dataset(Dataset): #繼承Dataset類
def __init__(self,root,transform=None): #root爲你數據的路徑 下面以圖片爲例
imgs = os.listdir(root) #返回root裏面所用文件的名稱
self.img = [os.path.join(root,img) for img in imgs] #生成每張照片的路徑
self.transform = transform #對圖片的一些處理
def __getitem__(self,index):
img_path = self.img(index)
label = 0 if 'woman' in img_path.split('/')[-1] else 1 #自己根據文件名來設置標籤,例如這裏是文件名包不包含woman。
data = Image.open(img_path) #讀取圖片,在PIL庫中
data = self.transform(data) #對圖片進行裝換,一定要轉換成tensor
return data,label #返回圖片和其標籤
def __len__(self):
return len(self.img) #返回數據的大小
data = dataset(root)
data_loader = DataLoader(data,batch_size=100,shuffle=True,drop_last= True)
#batch_size每一次迭代數據的大小 shuffle對圖片是否打散 drop_last對最後的數據如果不滿足batch_size的大小就捨棄
方法三:利用ImageFolder對圖片進行讀取
ImageFolder是對整個文件夾進行對取,每個文件夾的內容,會自動被歸爲一類。
from torchvision.datasets import ImageFolder
data = ImageFolder(root) #root的根目錄放保存每一類的文件夾
data_loader = DataLoader(data,batch_size=100,shuffle=True,drop_last= True)
基於這三種簡單易行的方法,你可以很方便的根據你數據的存放的形式進行構造自己的數據集。
下面介紹一下tf 2.0的構造自己的數據集,先看一下代碼吧,也不難。
import tensorflow as tf
x = #數據。numpy類型
y = #標籤。numpy類型
# x,y tensor類型的我還沒嘗試過你可以去轉換成tensor類型的試試。
data = tf.data.Dataset.slices((x,y))
data_load = data.repeat().shuffle(5000).batch(128).prefetch(1)
for step , (x,y) in enumerate(data_load.take(2000),1):
這種方法與pytorch的第一種方法類似。
prefetch(x) ,表示預先準備下x次迭代的數據,提高效率。
batch , 表示每一次迭代的數據大小,比如圖片的話就是每一次迭代128張圖片的數據。
shuffle(x) ,表示打亂數據的次序,x表示打亂的次數,每一次迭代算一次。
take(x) ,表示訓練的epoch數,在pytorch裏面需要在外面在嵌套一次for循環來設置訓練的epochs數。
Thank for your reading !!!