用于机器学习的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文件。

相关文章
相关标签/搜索