用於機器學習的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文件。

相關文章
相關標籤/搜索