日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch基础知识整理(二)数据加载

發(fā)布時間:2025/3/8 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch基础知识整理(二)数据加载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

pytorch數(shù)據(jù)加載組件位于torch.utils.data中。

from torch.utils.data import DataLoader, Dataset, Sampler

1, torch.utils.data.DataLoader

pytorch提供的數(shù)據(jù)加載器,它返回一個可迭代對象。不使用這個DataLoader,直接手動把每batch數(shù)據(jù)導(dǎo)入顯存當(dāng)然也可以,但是DataLoader類可以使跑模型和加載數(shù)據(jù)并行進行,效率高且更加靈活,所以通常都應(yīng)該用DataLoader來加載數(shù)據(jù)。

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=<function default_collate>, pin_memory=False, drop_last=False)

基本上從字面就能看懂各參數(shù)的含義。其中num_workers是指開多進程加載數(shù)據(jù),似乎在windows上不支持大于0的數(shù)字。pin_memory是指是否把數(shù)據(jù)固定到內(nèi)存中。
然后再用分別分裝數(shù)據(jù)集并用DataLoader調(diào)用:

train_dataset = DealDataset(mode='train') test_dataset = DealDataset(mode='test') kwargs = {"num_workers": 0, "pin_memory": True} train_loader = DataLoader(dataset=train_dataset, shuffle=True, batch_size=batch_size, **kwargs) test_loader = DataLoader(dataset=test_dataset, shuffle=True, batch_size=batch_size, **kwargs)

訓(xùn)練或推理時從DataLoader中取數(shù)據(jù)的方法一般如下:

for i in range(epoch):for batch_idx, (data, target) in enumerate(train_loader):if use_gpu:data, target = data.cuda(), target.cuda()

建議在訓(xùn)練模型前,先分別運行一次僅加載數(shù)據(jù)不跑模型的過程和僅跑模型不加載數(shù)據(jù)的過程,分別記錄兩個過程的時間以評估數(shù)據(jù)加載過程的耗時在訓(xùn)練過程中的比例,并據(jù)此考慮是否采取更復(fù)雜的措施提高數(shù)據(jù)加載速度。

2 torch.utils.data.Dataset

必須要先把數(shù)據(jù)構(gòu)造成dataset類型才能被DataLoader調(diào)用,支持兩種類型,一種是匹配型Dataset類,也就是其中定義了__getitem__()和__len__()方法,這種比較常用;另一種是迭代型IterabelDataset類,也就是其中定義了__iter__()方法的。

2.1 torch.utils.data.TensorDataset

把tensor直接包裝成dataset,通常數(shù)據(jù)不需要處理可直接用,且數(shù)據(jù)量不是太大的情況下使用。
注意:新版本pytorch中data_tensor, target_tensor兩個參數(shù)名已取消,直接放數(shù)據(jù)就可以,再指名參數(shù)名會報錯。

# myDataset = TensorDataset(data_tensor=x_tensor, target_tensor=y_tensor) 報錯 myDataset = TensorDataset(x_tensor, y_tensor)

2.2 torch.utils.data.Dataset

封裝dataset的基本類,可實現(xiàn)各種情況下非常靈活的數(shù)據(jù)集加載,使用時需要重寫它的__getitem__和__len__方法。

class DealDataset(Dataset):def __init__(self,mode='train'):X, y, Xt, yt = get_data()if mode=='train':self.x_data = Xself.y_data = yelif mode=='test':self.x_data = Xtself.y_data = ytself.len = self.x_data.shape[0]def __getitem__(self, index):data = self.x_data[index]target = self.y_data[index]return data, targetdef __len__(self):return self.len

在完成一項較大的建模工程時,通常需要試驗各種各樣的數(shù)據(jù)處理方案,因此數(shù)據(jù)加載方案要被大量修改,為了便于修改的靈活性、代碼的整潔性和避免修改的版本混亂,可以先使用一個BaseDataset基類確定肯定不會變的文件路徑等內(nèi)容,再使用子類繼承來獲得各種版本的數(shù)據(jù)處理方案。

3 torch.utils.data.Sampler

通常sampler不是必須的,但使用sampler可以更靈活的定義采樣次序,可以使用SequentialSampler順序采樣;RandomSampler隨機采樣(有放回或無放回);WeightedRandomSampler按權(quán)重隨機采樣;BatchSampler在一個batch中封裝一個其他的采樣器,返回一個batch大小的index索引。
也可以通過重寫Sampler類或其他子類中的__iter__()方法實現(xiàn)更靈活的自定義采樣器。

4, torchvision.transforms

對圖像類數(shù)據(jù)進行處理時經(jīng)常用到trochvision.transforms
.Compose(transforms)用來把多種變換組合起來

img_transforms = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406),(0.229, 0.224, 0.225))]) img = img_transforms(img) #注:該標(biāo)準(zhǔn)化系數(shù)為ImageNet用的系數(shù)

各種變換有:
.CenterCrop(size) 中心切割
.Resize((224,224)) 尺寸變換
.RandomCrop(size, padding=0) 隨機中心點切割
.RandomHorizontalFlip() 隨機水平翻轉(zhuǎn)
.RandomSizedCrop(size, interpolation=2) 隨機大小切割,然后再resize到size大小
.Pad(padding, fill=0) 四周pad
.Normalize(mean, std) 標(biāo)準(zhǔn)化
.ToTensor() 將PIL.Image或np.ndarray轉(zhuǎn)換為tensor
.Lambda(lambd) 函數(shù)式自定義變換

總結(jié)

以上是生活随笔為你收集整理的pytorch基础知识整理(二)数据加载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。