当你的数据集是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结尾的文本格式的文件 ...
随机推荐
- (0416) python正则 RE 【用python处理sv源文件-格式化代码】
https://zhuanlan.zhihu.com/p/144069088
- springcloud(四) - 服务治理Hystrix
功能介绍 调用下游服务,下游因为超时.异常等原因报错的时候.hystrix保证不会出现整体异常,避免雪崩.主要策略是服务的熔断.降级 应用场景 降级:异常.超时.熔断等情况发生后,不让客户端等待返 ...
- 微信小程序之配置业务域名踩过的坑
1.在配置业务域名弹窗中保存按钮一直加载状态,无法保存则刷新当前界面后重新扫码打开该弹窗.2.检验文件一定要放在目标服务器域名下前端文件夹中,否则(放在后台代码文件夹中)访问不到地址.
- win10关闭自动更新的方法
win10关闭自动更新的方法和步骤: 一.禁用Windows Update服务 1.打开服务项,win+r 输入 services.msc ,或者控制面板-管理工具-服务. 2.找到 Windows ...
- 生态学建模:增强回归树(BRT)预测短鳍鳗生存分布和影响因素|附代码数据
全文下载链接: http://tecdat.cn/?p=22482 最近我们被客户要求撰写关于增强回归树(BRT)的研究报告,包括一些图形和统计输出. 在本文中,在R中拟合BRT(提升回归树)模型.我 ...
- centos6根分区扩容,非lvm
1.关闭虚拟机,删除里面的快照,将磁盘扩容 2.根分区为sda3,开机后输入fdisk /dev/sda,d,3删除sda3,然后n,p,3,w创建sda3,扇区的开始位置要一致 3.growpart ...
- Perl 简单脚本处理log信息
执行了一段命令之后爆出了很多错误怎么收集 比如我们在编译一个大型项目时,编译出了很多报错,我们想收集出编译出错的每一行,肉眼看效率很低,在windows下没有grep怎么办呢? 在学习语法方面,使用p ...
- HOW TO RENDER TO A TEXTURE ARRAY IN UNITY
http://xdpixel.com/how-to-render-to-a-texture-array-in-unity/
- docker方式安装awvs和nessus渗透工具
docker-compose.yaml文件 version: '2' services: awvsnessus: image: leishianquan/awvs-nessus:v4 environm ...
- Mysql数据库基础第二章:(五)分组查询
Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...