深度学习数据集定义与加载
深度學習數(shù)據(jù)集定義與加載
深度學習模型在訓練時需要大量的數(shù)據(jù)來完成模型調(diào)優(yōu),這個過程均是數(shù)字的計算,無法直接使用原始圖片和文本等來完成計算。因此與需要對原始的各種數(shù)據(jù)文件進行處理,轉(zhuǎn)換成深度學習模型可以使用的數(shù)據(jù)類型。
一、框架自帶數(shù)據(jù)集
飛槳框架將深度學習任務(wù)中常用到的數(shù)據(jù)集作為領(lǐng)域API開放,對應(yīng)API所在目錄為paddle.vision.datasets與paddle.text.datasets,可以通過以下代碼飛槳框架中提供了哪些數(shù)據(jù)集。
import paddle
print(‘視覺相關(guān)數(shù)據(jù)集:’, paddle.vision.datasets.all)
print(‘自然語言相關(guān)數(shù)據(jù)集:’, paddle.text.datasets.all)
視覺相關(guān)數(shù)據(jù)集: [‘DatasetFolder’, ‘ImageFolder’, ‘MNIST’, ‘FashionMNIST’, ‘Flowers’, ‘Cifar10’, ‘Cifar100’, ‘VOC2012’]
自然語言相關(guān)數(shù)據(jù)集: [‘Conll05st’, ‘Imdb’, ‘Imikolov’, ‘Movielens’, ‘UCIHousing’, ‘WMT14’, ‘WMT16’]
警告
除paddle.vision.dataset與paddle.text.dataset外,飛槳框架還內(nèi)置了另一套數(shù)據(jù)集,路徑為paddle.dataset.*,但是該數(shù)據(jù)集的使用方式較老,會在未來的版本廢棄,盡量不要使用該目錄下數(shù)據(jù)集的API。
這里可以定義手寫數(shù)字體的數(shù)據(jù)集,其它數(shù)據(jù)集的使用方式也都類似。用mode來標識訓練集與測試集。數(shù)據(jù)集接口會自動從遠端下載數(shù)據(jù)集到本機緩存目錄~/.cache/paddle/dataset。
from paddle.vision.transforms import ToTensor
訓練數(shù)據(jù)集 用ToTensor將數(shù)據(jù)格式轉(zhuǎn)為Tensor
train_dataset = paddle.vision.datasets.MNIST(mode=‘train’, transform=ToTensor())
驗證數(shù)據(jù)集
val_dataset = paddle.vision.datasets.MNIST(mode=‘test’, transform=ToTensor())
二、自定義數(shù)據(jù)集
在實際的場景中,更多需要使用已有的相關(guān)數(shù)據(jù)來定義數(shù)據(jù)集。可以使用飛槳提供的paddle.io.Dataset基類,來快速實現(xiàn)自定義數(shù)據(jù)集。
import paddle
from paddle.io import Dataset
BATCH_SIZE = 64
BATCH_NUM = 20
IMAGE_SIZE = (28, 28)
CLASS_NUM = 10
class MyDataset(Dataset):
“”"
步驟一:繼承paddle.io.Dataset類
“”"
def init(self, num_samples):
“”"
步驟二:實現(xiàn)構(gòu)造函數(shù),定義數(shù)據(jù)集大小
“”"
super(MyDataset, self).init()
self.num_samples = num_samples
def __getitem__(self, index):"""步驟三:實現(xiàn)__getitem__方法,定義指定index時如何獲取數(shù)據(jù),并返回單條數(shù)據(jù)(訓練數(shù)據(jù),對應(yīng)的標簽)"""data = paddle.uniform(IMAGE_SIZE, dtype='float32')label = paddle.randint(0, CLASS_NUM-1, dtype='int64')return data, labeldef __len__(self):"""步驟四:實現(xiàn)__len__方法,返回數(shù)據(jù)集總數(shù)目"""return self.num_samples
測試定義的數(shù)據(jù)集
custom_dataset = MyDataset(BATCH_SIZE * BATCH_NUM)
print(’=custom dataset=’)
for data, label in custom_dataset:
print(data.shape, label.shape)
break
=custom dataset=
[28, 28] [1]
通過以上的方式,就可以根據(jù)實際場景,構(gòu)造自己的數(shù)據(jù)集。
三、數(shù)據(jù)加載
飛槳推薦使用paddle.io.DataLoader完成數(shù)據(jù)的加載。簡單的示例如下:
train_loader = paddle.io.DataLoader(custom_dataset, batch_size=BATCH_SIZE, shuffle=True)
如果要加載內(nèi)置數(shù)據(jù)集,將 custom_dataset 換為 train_dataset 即可
for batch_id, data in enumerate(train_loader()):
x_data = data[0]
y_data = data[1]
print(x_data.shape)
print(y_data.shape)
break
[64, 28, 28]
[64, 1]
通過上述的方法,就定義了一個數(shù)據(jù)迭代器train_loader, 用于加載訓練數(shù)據(jù)。通過batch_size=64設(shè)置了數(shù)據(jù)集的批大小為64,通過shuffle=True,在取數(shù)據(jù)前會打亂數(shù)據(jù)。此外,還可以通過設(shè)置num_workers來開啟多進程數(shù)據(jù)加載,提升加載速度。
注解
DataLoader 默認用異步加載數(shù)據(jù)的方式來讀取數(shù)據(jù),一方面可以提升數(shù)據(jù)加載的速度,另一方面也會占據(jù)更少的內(nèi)存。如果需要同時加載全部數(shù)據(jù)到內(nèi)存中,設(shè)置use_buffer_reader=False。
總結(jié)
以上是生活随笔為你收集整理的深度学习数据集定义与加载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Paddle广播 (broadcasti
- 下一篇: 深度学习数据预处理