PaddlePaddle2.0 數據加載及處理
你們好這裏是小白三歲,三歲白話系列第7話來啦!html
AIStudio項目地址:
https://aistudio.baidu.com/aistudio/projectdetail/1349615python
參考文檔:
Paddle官網:https://www.paddlepaddle.org.cn/documentation/docs/zh/2.0-rc/tutorial/quick_start/getting_started/getting_started.html#id3web
paddle API查看地址:https://www.paddlepaddle.org.cn/documentation/docs/zh/2.0-rc1/api/index_cn.html編程
CSDN地址
三歲白話系列CSDN:https://blog.csdn.net/weixin_45623093/category_10616602.htmlapi
paddlepaddle社區號:https://blog.csdn.net/PaddlePaddle框架
# 導入paddle並查看版本 import paddle print(paddle.__version__)
2.0.0-rc1
數據集
分爲框架自帶數據集和自定義(本身上傳)的數據集dom
數據的處理
paddle對內置的數據集和非內置的提供了兩種不用的模式異步
接下來讓咱們一塊兒來看看叭!svg
框架自帶數據集
paddle.vision.datasets
是cv(視覺領域)的有關數據集函數
paddle.text.datasets
是nlp(天然語言領域)的有關數據集
可使用__all__
魔法方法進行查看
print('視覺相關數據集:', paddle.vision.datasets.__all__) print('天然語言相關數據集:', paddle.text.datasets.__all__)
視覺相關數據集: ['DatasetFolder', 'ImageFolder', 'MNIST', 'FashionMNIST', 'Flowers', 'Cifar10', 'Cifar100', 'VOC2012'] 天然語言相關數據集: ['Conll05st', 'Imdb', 'Imikolov', 'Movielens', 'UCIHousing', 'WMT14', 'WMT16']
ToTensor
ToTensor是位於paddle.vision.transforms
下的API
做用是將 PIL.Image
或 numpy.ndarray
轉換成 paddle.Tensor
接下來看一下手寫數字識別的數據集的導入吧
在第6話的時候咱們就詳解了數字識別,這裏咱們再導入看看
from paddle.vision.transforms import ToTensor # 導入ToTensor API # 訓練數據集 用ToTensor將數據格式轉爲Tensor train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor()) # 經過mode選擇訓練集和測試集 # 驗證數據集 val_dataset = paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())
Cache file /home/aistudio/.cache/paddle/dataset/mnist/train-images-idx3-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/train-images-idx3-ubyte.gz Begin to download Download finished Cache file /home/aistudio/.cache/paddle/dataset/mnist/train-labels-idx1-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/train-labels-idx1-ubyte.gz Begin to download ........ Download finished Cache file /home/aistudio/.cache/paddle/dataset/mnist/t10k-images-idx3-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/t10k-images-idx3-ubyte.gz Begin to download Download finished Cache file /home/aistudio/.cache/paddle/dataset/mnist/t10k-labels-idx1-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/t10k-labels-idx1-ubyte.gz Begin to download .. Download finished
自帶數據集的處理方案
paddle.vision.transforms
中就有有關的處理辦法
使用__all__
魔法方法查看全部的處理方法
print('數據處理方法:', paddle.vision.transforms.__all__)
數據處理方法: ['BaseTransform', 'Compose', 'Resize', 'RandomResizedCrop', 'CenterCrop', 'RandomHorizontalFlip', 'RandomVerticalFlip', 'Transpose', 'Normalize', 'BrightnessTransform', 'SaturationTransform', 'ContrastTransform', 'HueTransform', 'ColorJitter', 'RandomCrop', 'Pad', 'RandomRotation', 'Grayscale', 'ToTensor', 'to_tensor', 'hflip', 'vflip', 'resize', 'pad', 'rotate', 'to_grayscale', 'crop', 'center_crop', 'adjust_brightness', 'adjust_contrast', 'adjust_hue', 'normalize']
舉例介紹
Compose
將用於數據集預處理的接口以列表的方式進行組合。
Resize
將輸入數據調整爲指定大小。
ColorJitter
隨機調整圖像的亮度,對比度,飽和度和色調。
from paddle.vision.transforms import Compose, Resize, ColorJitter # 定義想要使用那些數據加強方式,這裏用到了隨機調整亮度、對比度和飽和度(ColorJitter),改變圖片大小(Resize) transform = Compose([ColorJitter(), Resize(size=100)]) # 經過transform參數傳遞定義好的數據增項方法便可完成對自帶數據集的應用 train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
Cache file /home/aistudio/.cache/paddle/dataset/mnist/train-images-idx3-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/train-images-idx3-ubyte.gz Begin to download Download finished Cache file /home/aistudio/.cache/paddle/dataset/mnist/train-labels-idx1-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/train-labels-idx1-ubyte.gz Begin to download ........ Download finished
非自帶數據集的定義與加載
定義非自帶數據集
paddle.io.Dataset
概述Dataset的方法和行爲的抽象類。
映射式(map-style
)數據集須要繼承這個基類,映射式數據集爲能夠經過一個鍵值索引並獲取指定樣本的數據集,全部映射式數據集須實現如下方法:
__getitem__
: 根據給定索引獲取數據集中指定樣本,在 paddle.io.DataLoader
中須要使用此函數經過下標獲取樣本。
__len__
: 返回數據集樣本個數,paddle.io.BatchSampler
中須要樣本個數生成下標序列。
from paddle.io import Dataset # 導入Datasrt庫 class MyDataset(Dataset): """ 步驟一:繼承paddle.io.Dataset類 """ def __init__(self, mode='train'): """ 步驟二:實現構造函數,定義數據讀取方式,劃分訓練和測試數據集 """ super(MyDataset, self).__init__() if mode == 'train': self.data = [ ['traindata1', 'label1'], ['traindata2', 'label2'], ['traindata3', 'label3'], ['traindata4', 'label4'], ] else: self.data = [ ['testdata1', 'label1'], ['testdata2', 'label2'], ['testdata3', 'label3'], ['testdata4', 'label4'], ] def __getitem__(self, index): """ 步驟三:實現__getitem__方法,定義指定index時如何獲取數據,並返回單條數據(訓練數據,對應的標籤) """ data = self.data[index][0] label = self.data[index][1] return data, label def __len__(self): """ 步驟四:實現__len__方法,返回數據集總數目 """ return len(self.data) # 測試定義的數據集 train_dataset2 = MyDataset(mode='train') val_dataset2 = MyDataset(mode='test') print('=============train dataset=============') for data, label in train_dataset2: print(data, label) print('=============evaluation dataset=============') for data, label in val_dataset2: print(data, label)
=============train dataset============= traindata1 label1 traindata2 label2 traindata3 label3 traindata4 label4 =============evaluation dataset============= testdata1 label1 testdata2 label2 testdata3 label3 testdata4 label4
導入數據
class paddle.io.DataLoader(dataset, feed_list=None, places=None, return_list=False, batch_sampler=None, batch_size=1, shuffle=False, drop_last=False, collate_fn=None, num_workers=0, use_buffer_reader=True, use_shared_memory=False, timeout=0, worker_init_fn=None)
DataLoader
返回一個迭代器,該迭代器根據 batch_sampler
給定的順序迭代一次給定的 dataset
DataLoader
支持單進程和多進程的數據加載方式,當 num_workers
大於0時,將使用多進程方式異步加載數據。
# 此處暫時使用手寫數字識別的數據進行演示 train_loader = paddle.io.DataLoader(train_dataset, batch_size=64, shuffle=True) for batch_id, data in enumerate(train_loader()): x_data = data[0] y_data = data[1] print(x_data.numpy().shape) print(y_data.numpy().shape) ''' 定義了一個數據迭代器train_loader, 用於加載訓練數據。 經過batch_size=64咱們設置了數據集的批大小爲64, 經過shuffle=True,咱們在取數據前會打亂數據。 此外,咱們還能夠經過設置num_workers來開啓多進程數據加載,提高加載速度。 '''
非自帶數據集處理
方法一:一種是在數據集的構造函數中進行數據加強方法的定義,以後對__getitem__
中返回的數據進行應用
方法二:給自定義的數據集類暴漏一個構造參數,在實例化類的時候將數據加強方法傳遞進去
這裏用方法一進行舉例子:
from paddle.io import Dataset # 導入類庫 Dataset class MyDataset(Dataset): # 定義Dataset的子類MyDataset def __init__(self, mode='train'): super(MyDataset, self).__init__() if mode == 'train': self.data = [ ['traindata1', 'label1'], ['traindata2', 'label2'], ['traindata3', 'label3'], ['traindata4', 'label4'], ] else: self.data = [ ['testdata1', 'label1'], ['testdata2', 'label2'], ['testdata3', 'label3'], ['testdata4', 'label4'], ] # 定義要使用的數據預處理方法,針對圖片的操做 self.transform = Compose([ColorJitter(), Resize(size=100)]) # 和自帶數據的處理相似 def __getitem__(self, index): data = self.data[index][0] # 在這裏對訓練數據進行應用 # 這裏只是一個示例,測試時須要將數據集更換爲圖片數據進行測試 data = self.transform(data) label = self.data[index][1] return data, label def __len__(self): return len(self.data)
總結
這個的內容就先到這裏
感受裏面的東西又點多,看看再研究研究,能不能更細節一點,更加白話
那麼下次見,給你們一個好的體驗!
Paddle2.0-外部數據集導入詳解
本文同步分享在 博客「三歲學編程」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。