当你的数据集是hdf5格式的文件时,肿么办?
最近,自己构建了一个卷积神经网络,从网上下载到的数据集是hdf5格式的,希望用这个数据集来训练一下自己构建的这个神经网络。
1. 什么是hdf5?
HDF5是二进制数据格式,用于在磁盘上存储巨大的数值数据集(数据太大无法存储在内存中),同时便于对数据集的行进行遍历和计算。HDF5中的数据是分层存储的,类似于文件系统存储数据的方式。它可以存储两类数据对象;
1.dataset:类比于文件系统中的文件,可以操作list/ndarray的方式老操作它
2.group:类比于文件系统的文件夹,可以用操作dict的方式来操作它
数据是定义在group中,group类似层次容器的结构,可以包含零个或多个group或dataset的实例,以及支持元数据(metadata)。一旦定义了一个group,就可以在group中创建一个dataset。dataset可以理解为是一个多维数组(例如一个NumPy数组),注意:同一个多维数组中数据类型是相同的(整数、浮点数、unicode等)。图3.2显示了一个包含具有多个dataset的group的HDF5文件示例。本文我们将编写一个定制的Python类,使我们能够有效地接受输入数据并将其写入HDF5数据集。

图3.2
HDF5是用C编写的,但是,通过使用h5py模块(h5py.org),我们可以使用Python编程语言访问底层的C语言API。h5py之所以如此出色,是因为它易于与数据交互。我们可以在HDF5数据集中存储大量数据,并以类似于numpy的方式操作数据。例如,我们可以使用标准的Python语法访问和分割存储在磁盘上的tb级别数据集中的行,像加载到内存中操作一样简单。由于特殊的数据结构,这些分片和行访问速度非常快。当使用HDF5和h5py时,你可以将数据看作一个巨大的NumPy数组,虽然数据太大无法加载到内存中,但是仍然可以像在内存一样的访问和操作数据。
这个标准库最主要的一点在于开发者对它的积极维护以及在向下兼容方面花费的巨大精力。标准库的向下兼容不仅仅是API的兼容,亦包括文件格式的兼容,这意味着以HDF5格式存储的数据集本质上是可移植性的,可以被使用不同编程语言(如C、MATLAB和Java)的其他开发人员访问。
2. 如何使用hdf5?
上面我们已经知道了什么是hdf5文件以及他需要用h5py库来处理,但是,如何把数据送到神经网络中训练呢?
data_path = ""
import h5py
with h5py.File("{}".format(data_path),"r") as f:
col_list = []
f.visit(col_list.append)
print("{}文件的group包括:{}\n".format(data_path, col_list))
for i in col_list:
data_i = f["{}".format(i)]
此时,我们已经将hdf5文件中的各个group用不同的变量保存起来,那么下来该怎么做呢?本人没有理解hdf5文件的精髓(由于数据太大的情况下,电脑无法同时将数据加载到电脑的运行内存上,所以出现了hdf5文件来解决这个问题),把提取出的各个group写到了txt文件中,结果原本5G左右的数据一下飙升到30G左右,因此,我们需要直接将该文件递交给深度神经网络来训练。上述代码说明了如何访问以及提取各个group接下来说说如何使用。
# 上面的操作形式让我们想起了使用open()函数对txt文件的操作,没错,我们还可以用另外一种形式对文件进行操作,这种方法在jupyter notebook环境中更是棒棒的
hdf5_file = h5py.File("{}".format(data_path),"r")
col_list = []
hdf5_file.visit(col_list.append)
print("{}文件的group包括:{}\n".format(data_path, col_list))
for i in col_list:
data_i = hdf5_file["{}".format(i)]
# 假设该hdf5文件中含有的group有"X"、"Y",且"X"表示训练数据,"Y"表示标签
# 使用zip()函数将二者合在一起,用于训练集、测试集的划分,或许还有别的办法,希望读者能够提供
data = list(zip(data_X,data_Y))
from sklearn.model_selection import train_test_split
train,test = train_test_spilt(data)
x_train,y_train = zip(*train)
x_test,y_test = zip(*test)
# 理论上上述命令操作之后已经构建成功了训练集、测试集,但是当把他们导入模型时,出了问题
# 报错:TypeError:Error when checking input data: it should be numpy array, or list/dict.Found:(array(****************))
# 大致是这么个意思,由于之前的问题解决了,搜索的网页没有保留
# 该问题的主要原因是经过zip操作之后,将原来的array格式的数据变成了元组形式,我们主要把他们变回去就好了
x_train_lst = list(x_train)
y_train_lst = list(y_train)
x_test_lst = list(x_test)
y_test_lst = list(y_test)
# 这样就可以了,可以把他们送入模型中
from keras.models import Model
from keras.layers import Input
# 最简单的模型
input = Input((max_len,))
output = Dense()(input)
model = Model(inputs=input, outputs=output)
model.compile(optimizer="adam",loss="MSE",metrics=["accuracy"])
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
callbacks=my_callbacks,
validation_data=(x_test, y_test))
# 完成,关闭hdf5文件
hdf5_file.close()
对于keras构建模型,可以看这篇文章,keras构建1D卷积神经网络
当你的数据集是hdf5格式的文件时,肿么办?的更多相关文章
- 解析某些特殊格式XML文件时,获取不到根节点问题
还是在语音识别这块.在读取本地的SRGS的XML后,无法获取到根节点<grammar>. 下面是SRGS.XML文件(只给出了根节点) <?xml version="1.0 ...
- 在VMD上可视化hdf5格式的分子轨迹文件
技术背景 在处理分子动力学模拟的数据时,不可避免的会遇到众多的大轨迹文件.因此以什么样的格式来存储这些庞大的轨迹数据,也是一个在分子动力学模拟软件设计初期就应该妥善考虑的问题.现有的比较常见的方式,大 ...
- VMD可视化hdf5格式的分子坐标文件
技术背景 VMD是分子动力学模拟领域常用的一款可视化软件,可以非常直观方便的展示分子的运动过程.而VMD本身对展现的格式有一定的要求,如果不是常见的rst等类型的坐标文件的话,就需要自己手动去实现一个 ...
- caffe上使用hdf5格式文件以及回归(regression)问题
最近用caffe做了一下regression问题,先用data layer中的data,float_data试了一下,data用来存放图片,float_data存放regression的values, ...
- 【Python图像特征的音乐序列生成】解析ABC格式的文件(修改版)
ABC格式,是一个音乐标准,ABC Plus Project最新的标准是2.x. ABC格式的音乐长成这样: X: T:Abacus % Nottingham Music Database S:By ...
- od 查看特殊格式的文件内容
用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进制和ASCII码来显示文件. 语法: od [选项] 文件- 命令中各选项的含义: - A 指定地址基数 ...
- 怎么统计指定文件夹下含有.xml格式的文件数目
如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...
- MySQL如何导出带日期格式的文件
一网友问在MySQL中如何只用SQL语句导出带日期格式的文件.觉得有点意思,于是尝试了一下.导出文件使用SELECT INTO OUTFILE 但是OUTFILE后面的值不能使用变量,所以只能使用动态 ...
- 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本
摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...
- 如何让Hadoop读取以gz结尾的文本格式的文件
背景: 搜索引擎在build全量时,会产生数G的xml的中间文件,我需要去查询这些中间文件中,是否有某个特殊的字符.xml文件有很多,每个都有几百M,存储在hdfs上,而且是以gz结尾的文本格式的文件 ...
随机推荐
- 004. html篇之《标签分类和嵌套规则》
html篇之<标签分类和嵌套规则> 一.常用标签 (1) <div></div> 一个区块容器标记,可以包含图片.表格.段落等各种html元素 (2) <sp ...
- (原创)odoo中字段默认值的获取顺序
odoo中某个字段的默认值的取值顺序 1.搜索当前记录集(recordset)中的context中是否存在"default_字段名"的键,如果存在则取值 2.搜索模型(ir.def ...
- hive元起动报错:Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
错误原因: 1.系统找不到这个类所在的jar包 2.jar包的版本不一样系统不知道使用哪个. hive启动报错的原因是后者 解决办法: 1.com.google.common.base.Precond ...
- JAVA框架知识
Java中的MVC: M是指模型层,C则是控制器,V是指视图:一个完整的请求过程是,客户端发送请求到控制器,控制器调用业务层处理请求,并返回处理结果给视图,其中业务层是调用Dao层去完成业务逻辑的:M ...
- Linux常用的操作指令01
关键字: linux 查进程.杀进程.起进程1.查进程 ps命令查找与进程相关的PID号: ps a 显示现行终端机下的所有程序,包括其他用户的程序. ps -A 显示所有程序. ...
- eKuiper 1.8.0 发布:零代码实现图像/视频流的实时 AI 推理
LF Edge eKuiper 是 Golang 实现的轻量级物联网边缘分析.流式处理开源软件,可以运行在各类资源受限的边缘设备上.eKuiper 的主要目标是在边缘端提供一个流媒体软件框架(类似于 ...
- Typora以及Markdown学习
Typora以及Markdown学习 标题 n级标题 一级标题为#+[空格]+标题或者ctrl+1 二级标题则为``##+[空格]+标题`或者ctrl+2 后续几级标题依此类推... 最多支持6级标题 ...
- 通过抓取pintpoint2的页面信息把数据存入数据库python3
目标:对生产环境的服务质量进行量化, 解决办法:把pintpoint2里的数据转存入mysql数据库,作成报表,目前支持总请求数,错误请求数,中位数,平均数,95值(每分钟一次定时任务),其它指标可以 ...
- win的安全更新安装不成功,可用下面命令进行强制更新
- wpf treeview 新增右键菜单
<TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <E ...