用於機器學習的Python和HDFS

Python平臺是MATLAB或Mathematica等封閉源(和昂貴的!)平臺的強大替代品。多年來,隨着NumPy和SciPy(用於一般科學計算)和TensorFlow,Keras,Theano和PyTorch等平臺的積極開發,今天通過Python環境可供所有人使用的功能是驚人的。添加像Jupyter筆記本電腦這樣的東西,對於我們大多數人來說,這筆交易是密封的。

就個人而言,我差不多五年前就停止使用MATLAB。MATLAB擁有一系列令人難以置信的軟件模塊,可用於您可以想象,授予的任何學科,並且Python沒有那麼大的模塊可用(嗯,至少還沒有)。但是對於我每天都在進行的深度學習工作,Python平臺已經非常出色。

我今天使用了幾種工具來學習機器。當我從事網絡安全工作時,我傾向於使用pip作爲我的模塊管理器,並使用虛擬env包裝器(使用虛擬env,duh)作爲我的環境管理器。對於機器學習,我使用Anaconda。我很欣賞Anaconda,因爲它在單一工具中提供模塊管理和環境管理。我也會將它用於網絡安全工作,但它以科學計算爲重點,我使用的許多面向系統的模塊都不能通過Anaconda獲得,需要通過pip安裝。

我還安裝了NumPy,scikit-learn,Jupyter,IPython和ipdb。我將這些基本功能用於機器學習項目。我通常會安裝一些TensorFlow,Keras或PyTorch的組合,這取決於我正在做什麼。我也使用tmux和powerline,但這些不是Python模塊(好吧,powerline是,通過powerline-status)。但它們很漂亮,我真的很喜歡它們與IPython的集成方式。最後,我安裝了H5py。

H5py是我今天想和你談談的。相當多的人不熟悉它,也不熟悉底層數據存儲格式HDF5。他們應該是。

Python有自己的全功能數據序列化格式。每個與Python合作過很長時間的人都知道並喜歡pickle文件。它們方便,內置,易於保存和加載。但他們可能很大。而且我並不是說有點大。我的意思是很多千兆字節(兆兆字節?),特別是在使用圖像時。我們甚至不考慮視頻。

HDF5(分層數據格式5)是最初設計用於大型地理空間數據集的數據存儲系統。它是從HDF4發展而來的,HDF4是HDF集團創建的另一種存儲格式。它解決了使用pickle文件存儲大型數據集的一些顯着缺點 - 它不僅有助於控制存儲數據集的大小,還消除了負載滯後,並且具有更小的內存佔用。

存儲大小

HDF5通過H5py爲您提供與NumPy和SciPy等存儲數據類型相同的靈活性。這爲您提供了在指定張量元素大小時非常具體的功能。當您擁有數百萬個單獨的數據元素時,使用16位或32位數據寬度之間存在相當大的差異。

您還可以在創建和保存數據集時指定壓縮算法和選項,包括LZF,LZO,GZIP和SZIP。您也可以指定壓縮算法的***性。這是一個很大的問題 - 使用稀疏數據集,壓縮這些數據集中的元素的能力可以節省大量空間。我通常使用具有最高壓縮級別的GZIP,並且您可以節省多少空間。在我最近創建的一個圖像數據集上,由於我使用的模型,我被迫使用int64來存儲二進制值。壓縮允許我消除這些二進制值上幾乎所有空的開銷,將存檔從先前的int8實現中縮小40%(使用字段的整個寬度將二進制值保存爲ASCII)。

負載滯後

需要將Pickle文件完全加載到要使用的進程地址空間中。它們是序列化的內存駐留對象,要訪問它們需要是內存居民,對吧?HDF5文件只是不關心。

HDF5是一組分層的數據對象(大震,對,因爲層次結構是名稱中的第一個單詞?)。因此,它更像是文件系統而不是單個文件。這個很重要。

因爲它更像是文件系統而不是單個數據文件,所以您不需要一次加載文件的所有內容。HDF5和H5py將一個小驅動程序加載到內存中,該驅動程序負責從HDF5數據文件訪問數據。這樣,您只需加載您需要的內容。如果您曾嘗試加載大型pickle文件,那麼您知道這是多麼重要。您不僅可以快速加載數據,還可以通過舒適的Pythonic數據訪問接口(如索引,切片和列表推導)快速訪問數據。

數據足跡

無需在每次需要使用時加載所有數據,也可以在運行時內存中提供更小的數據佔用空間。當您使用高分辨率真彩×××像訓練深度網絡時,您的像素深度大約爲32位,那麼您使用的是大量內存。您需要釋放儘可能多的內存來訓練您的模型,這樣您就可以在幾天而不是幾周內完成。爲了存儲數據而留出太字節(或千兆字節)的內存只是浪費資源,使用你不需要的HDF5。

HDF5本質上是一個鍵/值存儲,存儲爲樹。您可以訪問數據集或組。數據集也是數據集。組是數據集的集合,您可以通過鍵訪問它們。數據集是存儲圖中的葉元素,組是內部節點。組可以容納其他組或數據集; 數據集只能包含數據。組和數據集都可以具有與之關聯的任意元數據(再次存儲爲鍵值對)。在HDF5中,此元數據稱爲屬性。訪問數據集非常簡單:

將 h5py  導入爲 h5
用 h5。文件('filename.h5','r')爲 f:
group = f [ 'images' ]
dataset = group [ 'my dataset' ]
#繼續,使用數據集!我賭你!

圖1:啓用HDF5,Python風格。

H5py是HDF5文件的Python接口,易於使用。它支持現代  with 語義以及傳統  open/close 語義。使用屬性,您不必依賴命名約定來提供存儲數據集的元數據(如圖像分辨率,起源或創建時間)。您將該數據作爲屬性存儲在對象本身上。

Python現在經常用於數據分析,包括統計數據分析和機器學習。我們中的許多人也使用本機序列化格式來處理數據。雖然pickle文件易於使用,但在處理大量數據時它們會陷入困境。HDF5是一個專爲巨大的地理空間數據集而設計的數據存儲系統,可以完美地拾取pickle文件。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章