当前位置: 首页>编程语言>正文

h5文件作为权重该怎么设计 h5文件怎么用

下述内容根据官方文档翻译而来,官方文档链接如下:

http://docs.h5py.org/en/latest/quick.html

快速入门指南:

h5py包是HDF5二进制数据格式的python接口。

HDF5允许您存储大量数字数据,并且可以轻松地从NumPy操作这些数据。例如,您可以将存储在磁盘上的多TB数据集切片,就像它们是真正的NumPy数组一样。数千个数据集可以存储在一个文件中,按您的需要进行分类和标记。

HDF5文件是两种对象的容器:数据集(类似数组的数据集合)和组(类似文件夹的容器,用于保存数据集和其他组)。使用h5py最基本的要记住的是:

组的工作方式类似于字典,而数据集的工作方式类似于NumPy数组。

假设有人给你发送了一个HDF5文件,mytestfile.hdf5。(要创建此文件,请参阅附录:创建文件。)你需要做的第一件事就是打开文件进行阅读:

>>> import h5py

>>> f = h5py.File('mytestfile.hdf5', 'r')

文件对象是您的起点。这个文件中存储了什么?记得h5py。文件的作用类似于Python字典,因此我们可以检查键:

>>> list(f.keys())

['mydataset']

根据我们的观察,文件中有一个数据集,mydataset。让我们以数据集对象的形式检查数据集:

>>> dset = f['mydataset']

我们得到的对象不是一个数组,而是一个HDF5数据集。与NumPy数组一样,数据集具有形状和数据类型:

>>> dset.shape

(100,)

>>> dset.dtype

dtype('int32')

它们还支持数组样式的切片。这就是从文件中的数据集读取和写入数据的方式:

>>> dset[...] = np.arange(100)

>>> dset[0]

0

>>> dset[10]

10

>>> dset[0:100:10]

array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

附录:创建文件

此时,您可能想知道mytestdata是如何被创建的。我们可以通过在初始化文件对象时将模式设置为w来创建文件。其他一些模式是a(用于读/写/创建访问)和r+(用于读/写访问)。文件访问模式及其含义的完整列表在文件对象中。

>>> import h5py

>>> import numpy as np

>>> f = h5py.File("mytestfile.hdf5", "w")

File对象有两个看起来很有趣的方法。其中之一是create_dataset,顾名思义,它创建给定形状和dtype的数据集:

>>> dset = f.create_dataset("mydataset", (100,), dtype='i')

文件对象是一个上下文管理器;所以下面的代码也可以工作:

>>> import h5py

>>> import numpy as np

>>> with h5py.File("mytestfile.hdf5", "w") as f:

>>> dset = f.create_dataset("mydataset", (100,), dtype='i')

组和层次化组织

HDF代表分层数据格式。HDF5文件中的每个对象都有一个名称,它们被安排在POSIX类型的层次结构中,用“/”做分隔。

>>> dset.name

u'/mydataset'

这个系统中的文件夹称为组。我们创建的文件对象本身就是一个组,在本例中是根组,名为“/”。

>>> f.name

u'/'

创建子组是通过适当命名的create_group完成的。但是我们需要先以追加模式打开文件(如果存在读/写,则以其他方式创建):

>>> f = h5py.File('mydataset.hdf5', 'a')

>>> grp = f.create_group("subgroup")

所有组对象也都有create_*方法,比如File:

>>> dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')

>>> dset2.name

u'/subgroup/another_dataset'

顺便说一下,您不必手动创建所有中间组。指定完整路径就可以了:

>>> dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')

>>> dset3.name

u'/subgroup2/dataset_three'

组支持大多数Python字典样式的接口。使用项目检索语法检索文件中的对象:

>>> dataset_three = f['subgroup2/dataset_three']

对组进行迭代会提供其成员的名称:

>>> for name in f:

... print name

mydataset

subgroup

subgroup2

成员是否存在的测试也使用名称:

>>> "mydataset" in f

True

>>> "somethingelse" in f

False

甚至可以使用完整路径名:

>>> "subgroup/another_dataset" in f

True

还有熟悉的keys(), values(), items() 和 iter() 方法, 以及 get()。

由于对一个组进行迭代只会产生其直接连接的成员,所以对整个文件进行迭代是使用组方法visit()和visititems()完成的,这两个方法都是可调用的:

>>> def printname(name):

... print name

>>> f.visit(printname)

mydataset

subgroup

subgroup/another_dataset

subgroup2

subgroup2/dataset_three

属性:

HDF5的一个最好的特性是,您可以在它所描述的数据旁边存储元数据。所有组和数据集都支持附加的称为属性的数据位。

属性通过attrs代理对象访问,该对象再次实现dictionary接口:

>>> dset.attrs['temperature'] = 99.5

>>> dset.attrs['temperature']

99.5

>>> 'temperature' in dset.attrs

True


https://www.xamrdz.com/lan/5tg1951285.html

相关文章: