当你的数据集是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结尾的文本格式的文件 ...
随机推荐
- mybatis-plus主键生成策略(实体类配置,数据库插入数据自动生成id)
转载:MyBatisplus -- ActiveRecord(AR)_mybatisplus idtype.auto_憨憨浩浩的博客-CSDN博客 0.auto:自动增长(mysql,sql serv ...
- IO学习笔记(全)
IO学习笔记 目录 IO学习笔记 一.IO前置知识--Linux系统 1.1 Linux系统--虚拟文件系统(VFS) 1.1.1 首先我们来了解一下Linux中的文件描述 1.1.2 文件类型 父子 ...
- es的核心原理 (一)
搜索引擎 搜索引擎的分类 全文搜索:谷歌.百度.必应:这种搜索过程到底搜索啥,不知道,有可能是个帖子,也有可能是个门户网站 垂直搜索:视频网站.各大电商:这种搜索内容是固定的,比如在懂车帝,你搜索的一 ...
- Jenkins+Docker 实现一键自动化部署项目!
博主分享的非常好:https://mp.weixin.qq.com/s/a0JOuiqLsUMcQSEjZ4uGTg 本文章实现最简单全面的Jenkins+docker+springboot 一键自动 ...
- 通过系统函数分配内存sbrk/sbrk
#include <unistd.h> #include <stdio.h> int main(void) { printf("================brk ...
- html的table多级表头表格的代码
1,两级表头的代码 <html> <head> <title>多层表头</title> <link rel="stylesheet&qu ...
- 【git】3.3 git分支-分支管理
资料来源 (1) https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86 ...
- Maven3.6.1 (转载大佬文章)
(30条消息) Maven3.6.1安装及配置_浅若清风过的博客-CSDN博客 1.下载https://archive.apache.org/dist/maven/maven-3/3.6.1/bina ...
- J V M(三)沙箱安全机制
沙箱安全机制 Java安全模型的核心就是Java沙箱(sandbox)什么是沙箱? 沙箱是一个限制程序运行的环境.沙箱机制就是将Java代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本 ...
- 简单记录五个Linux设置定时任务的步骤(自动化运维必备)
这几天我们国庆节休息,但是作为运维工作的同学们是不是也不能闲着,担心工作中是不是有任务在执行中需要维护.于是,我们很多的运维工作都是用的自动化运维监控,如果有故障都会定时的处理和告警的.这个与我们的L ...