一種管理深度學(xué)習(xí)數(shù)據(jù)集的新方法
譯文Hub簡介
Activeloop的Hub是一個(gè)開源Python軟件包,可將數(shù)據(jù)排列在類似Numpy的數(shù)組中。它與Tensorflow和PyTorch等深度學(xué)習(xí)框架無縫集成,可加快GPU處理和訓(xùn)練。我們可以使用Hub API來更新數(shù)據(jù)、可視化數(shù)據(jù)以及創(chuàng)建機(jī)器學(xué)習(xí)管道。
Hub讓我們可以存儲(chǔ)圖像、音頻、視頻和時(shí)間序列數(shù)據(jù),又能做到訪問起來很快。數(shù)據(jù)可以存儲(chǔ)在GCS/S3存儲(chǔ)桶、本地存儲(chǔ)或Activeloop云上。數(shù)據(jù)可直接用于訓(xùn)練Pytorch模型,這樣您無需構(gòu)建數(shù)據(jù)管道。Hub還提供數(shù)據(jù)版本控制、數(shù)據(jù)集搜索查詢和分布式工作負(fù)載。
我在使用Hub后覺得很棒,能夠在幾分鐘內(nèi)創(chuàng)建數(shù)據(jù)并將數(shù)據(jù)推送到云端。本文介紹如何使用Hub來創(chuàng)建和管理數(shù)據(jù)集。
- 在Activeloop云上初始化數(shù)據(jù)集
- 處理圖像
- 將數(shù)據(jù)推送到云端
- 數(shù)據(jù)版本控制
- 數(shù)據(jù)可視化
Activeloop存儲(chǔ)
Activeloop為開源數(shù)據(jù)集和私有數(shù)據(jù)集提供免費(fèi)存儲(chǔ)。您還可以通過推薦介紹獲得多達(dá) 200 GB的免費(fèi)存儲(chǔ)空間。Activeloop的Hub與Database for AI對接,讓我們可以使用標(biāo)簽可視化數(shù)據(jù)集,復(fù)雜的搜索查詢讓我們可以高效地分析數(shù)據(jù)。該平臺(tái)還含有100多個(gè)圖像分割、分類和對象檢測方面的數(shù)據(jù)集。
要?jiǎng)?chuàng)建帳戶,您可以使用Activeloop網(wǎng)站來注冊,或者輸入“!activeloop register”。該命令將要求您添加用戶名、密碼和電子郵件。成功創(chuàng)建帳戶后,我們將使用“!activeloop login” 來登錄。現(xiàn)在,我們可以直接從本地機(jī)器創(chuàng)建和管理云數(shù)據(jù)集。
如果您使用Jupyter Notebook,請使用“!”,否則直接在CLI中添加沒有!的命令。
!activeloop register
!activeloop login -u -p
初始化Hub數(shù)據(jù)集
在本教程中,我們將使用采用(CC BY 4.0)的Kaggle數(shù)據(jù)集Multi-class Weather。該數(shù)據(jù)集含有四個(gè)基于天氣分類的文件夾;Sunrise、Shunshine、Rain和Cloudy。
首先,我們需要安裝hub和kaggle軟件包。kaggle軟件包將允許我們直接下載數(shù)據(jù)集并解壓縮。
!pip install hub kaggle
!kaggle datasets download -d pratik2901/multiclass-weather-dataset
!unzip multiclass-weather-dataset
下一步,我們將在Activeloop云上創(chuàng)建HUB數(shù)據(jù)集。數(shù)據(jù)集函數(shù)還可以創(chuàng)建新數(shù)據(jù)集或訪問舊數(shù)據(jù)集。您還可以提供AWS存儲(chǔ)桶地址,以便在亞馬遜服務(wù)器上創(chuàng)建數(shù)據(jù)集。想在Activeloop上創(chuàng)建數(shù)據(jù)集,我們需要傳遞含有用戶名和數(shù)據(jù)集名稱的URL。
“hub://<username>/<datasetname>”
import hub
ds = hub.dataset('hub://kingabzpro/muticlass-weather-dataset')
數(shù)據(jù)預(yù)處理
在將數(shù)據(jù)處理成hub格式之前,我們需要準(zhǔn)備數(shù)據(jù)。下面的代碼將提取文件夾名稱并將其存儲(chǔ)在“class_names”變量中。在第二部分,我們將創(chuàng)建數(shù)據(jù)集文件夾中可用的文件列表。
from PIL import Image
import numpy as np
import os
dataset_folder = '/work/multiclass-weather-dataset/Multi-class Weather Dataset'
class_names = os.listdir(dataset_folder)
files_list = []
for dirpath, dirnames, filenames in os.walk(dataset_folder):
for filename in filenames:
files_list.append(os.path.join(dirpath, filename))
file_to_hub函數(shù)接受三個(gè)參數(shù):文件名、數(shù)據(jù)集和類名。它從每個(gè)圖像中提取標(biāo)簽,并將它們轉(zhuǎn)換成整數(shù)。它還將圖像文件轉(zhuǎn)換成類似Numpy的數(shù)組,并將它們附加到tensor。就這個(gè)項(xiàng)目而言,我們只需要兩個(gè)tensor,一個(gè)用于標(biāo)簽,一個(gè)用于圖像數(shù)據(jù)。
compute.
def file_to_hub(file_name, sample_out, class_names):
## First two arguments are always default arguments containing:
# 1st argument is an element of the input iterable (list, dataset, array,...)
# 2nd argument is a dataset sample
# Other arguments are optional
# Find the label number corresponding to the file
label_text = os.path.basename(os.path.dirname(file_name))
label_num = class_names.index(label_text)
# Append the label and image to the output sample
sample_out.labels.append(np.uint32(label_num))
sample_out.images.append(hub.read(file_name))
return sample_out
不妨創(chuàng)建一個(gè)帶有“png”壓縮的圖像tensor和一個(gè)簡單的標(biāo)簽tensor。確保tensor的名稱應(yīng)與我們在file_to_hub函數(shù)中提到的名稱相似。想了解有關(guān)tensor的更多信息,請參閱《API摘要 - Hub 2.0》:https://docs.activeloop.ai/api-basics#creating-tensors-and-adding-data。
最后,我們將通過提供files_lists、hub數(shù)據(jù)集實(shí)例“ds”和class_names來運(yùn)行file_to_hub函數(shù)。由于需要轉(zhuǎn)換數(shù)據(jù)并推送到云端,這需要幾分鐘。
with ds:
ds.create_tensor('images', htype = 'image', sample_compression = 'png')
ds.create_tensor('labels', htype = 'class_label', class_names = class_names)
file_to_hub(class_names=class_names).eval(files_list, ds, num_workers = 2)
數(shù)據(jù)可視化
現(xiàn)在該數(shù)據(jù)集在multiclass-weather-dataset上公開可用。我們可以使用標(biāo)簽探索數(shù)據(jù)集或添加描述,以便其他人可以了解有關(guān)許可證信息和數(shù)據(jù)分布的更多信息。Activeloop不斷添加新功能,以改善查看體驗(yàn)。
我們還可以使用Python API來訪問數(shù)據(jù)集。我們將使用PIL的Image函數(shù)將數(shù)組轉(zhuǎn)換成圖像,并將其顯示在Jupyter筆記本中。
Image.fromarray(ds["images"][0].numpy())
為了訪問標(biāo)簽,我們將使用含有分類信息的class_names,并使用“標(biāo)簽”tensor來顯示標(biāo)簽。
class_names = ds["labels"].info.class_names
class_names[ds["labels"][0].numpy()[0]]
>>> 'Cloudy'
提交
我們還可以創(chuàng)建不同的分支,并管理不同的版本,比如Git和DVC。在本節(jié)中,我們將更新class_names信息,并使用該信息創(chuàng)建提交。
ds.labels.info.update(class_names = class_names)
ds.commit("Class names added")
>>> '455ec7d2b49a36c14f3d80d0879369c4d0a70143'
正如我們所看到的,日志顯示我們已成功地將更改提交到主分支。想了解有關(guān)版本控制的更多信息,請參閱《數(shù)據(jù)集版本控制 - Hub 2.0》:https://docs.activeloop.ai/getting-started/step-8-dataset-version-control。
log = ds.log()
---------------
Hub Version Log
---------------
Current Branch: main
Commit : 455ec7d2b49a36c14f3d80d0879369c4d0a70143 (main)
Author : kingabzpro
Time : 2022-01-31 08:32:08
Message: Class names added
您還可以使用Hub UI查看所有分支和提交。
原文標(biāo)題:??A New Way of Managing Deep Learning Datasets??,作者:Abid Ali Awan