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文件。