Python 谷歌云机器学习中如何处理大量HDF5文件?
我有大约5k的原始数据输入文件和15k的原始数据测试文件,总共有几GB。由于这些是原始数据文件,我必须在Matlab中迭代处理它们,以获得我想要在(CNN)上训练实际分类器的特征。结果,我为每个原始数据文件生成了一个HDF5Python 谷歌云机器学习中如何处理大量HDF5文件?,python,tensorflow,h5py,google-cloud-ml,Python,Tensorflow,H5py,Google Cloud Ml,我有大约5k的原始数据输入文件和15k的原始数据测试文件,总共有几GB。由于这些是原始数据文件,我必须在Matlab中迭代处理它们,以获得我想要在(CNN)上训练实际分类器的特征。结果,我为每个原始数据文件生成了一个HDF5mat文件。我使用Keras在本地开发了我的模型,并修改了directoryinterator,其中有 for i, j in enumerate(batch_index_array): arr = np.array(h5py.File(os.path
mat
文件。我使用Keras在本地开发了我的模型,并修改了directoryinterator
,其中有
for i, j in enumerate(batch_index_array):
arr = np.array(h5py.File(os.path.join(self.directory, self.filenames[j]), "r").get(self.variable))
# process them further
文件结构是
|
|--train
| |--Class1
| | |-- 2,5k .mat files
| |
| |--Class2
| |-- 2,5k .mat files
|--eval
| |--Class1
| | |-- 2k .mat files
| |
| |--Class2
| |-- 13k .mat files
这是我现在在Google ML存储桶中的文件结构。它在本地使用python和一个小模型,但现在我想利用GoogleML超参数调优功能,因为我的模型要大得多。问题是,我在互联网上读到,HDF5文件无法直接轻松地从Google ML存储中读取。我试图修改我的脚本,如下所示:
import tensorflow as tf
from tensorflow.python.lib.io import file_io
for i, j in enumerate(batch_index_array):
with file_io.FileIO((os.path.join(self.directory, self.filenames[j], mode='r') as input_f:
arr = np.array(h5py.File(input_f.read(), "r").get(self.variable))
# process them further
但是它给了我类似于这个的错误,只是其他的十六进制和位置512。我也有这样的经历:
import tensorflow as tf
from tensorflow.python.lib.io import file_io
for i, j in enumerate(batch_index_array):
with file_io.FileIO((os.path.join(self.directory, self.filenames[j], mode='rb') as input_f:
arr = np.fromstring(input_f.read())
# process them further
但它也不起作用
问题我如何修改我的脚本以便能够读取Google ML中的那些HDF5文件?我知道数据pickle的做法,但问题是,将15k文件(几GB)创建的pickle加载到内存似乎不是很有效。HDF是一种非常常见的文件格式,不幸的是,在云中不是最佳的。有关原因的解释,请参阅博客文章 考虑到云端HDF固有的复杂性,我推荐以下方法之一:
import os
import subprocess
if os.environ.get('TFCONFIG', {}).get('task', {}).get('type') != 'ps':
subprocess.check_call(['mkdir', '/tmp/my_files'])
subprocess.check_call(['gsutil', '-m', 'cp', '-r', 'gs://my/bucket/my_subdir', '/tmp/myfiles'])
从临时文件(如对象)读取数据 我不能直接访问谷歌ML,所以如果这个答案不起作用,我必须道歉。我做了一些类似的事情,直接从压缩文件夹中读取h5文件,但我希望这将在这里起作用
from scipy import io
import numpy as np
from io import BytesIO
#Creating a Testfile
Array=np.random.rand(10,10,10)
d = {"Array":Array}
io.savemat("Test.mat",d)
#Reading the data using a in memory file-like object
with open('Test.mat', mode='rb') as input_f:
output = BytesIO()
num_b=output.write(input_f.read())
ab = io.loadmat(output)
尝试读取模式rb而不是r。我猜r试图将数据解释为字符串。这就是我尝试的,它在一定程度上起作用,但随后出现了一些错误,我可能会再次检查它。问题是,当我从
mat
文件打印字节字符串时,在开始时,有一行描述了文件属性、创建文件的Matlab版本等。对于mat文件,这应该是最简单的读取方式。为什么要创建这么多文件,而不是创建一个包含所有数据的简单数据集?它的读取速度会很慢,但不是因为hdf5。通过网络访问数据具有很高的延迟。再看一看,这将显示块大小对I/O速度的影响。通过网络,您需要相当大的块大小才能获得良好的性能。我使用了其他人创建的Matlab脚本,如果您将“arr=np.fromstring(input\f.read())”替换为“arr=scipy.io.loadmat(input\f.read())”真的不起作用吗?还可以尝试“arr=scipy.io.loadmat(input_f)”,您不必具有访问权限。Google ML使用Tensorflow,所以技术上的问题是“在Tensorflow中读取HDF5文件”。至少我想是这样。无论如何,我想我要创建一个巨大的CSV文件,而不是几千个文件,我想这会更容易。你不能把一个简单的numpy数组放到tensorflow中吗?如本文所述,还是您没有正常的方式访问文件?那么您如何访问csv文件呢?如果是这样,我就放弃这里。从二进制数据中写入csv文件(文本文件),然后对其进行解析,就像打印一本电子书,然后扫描……我可以,但我不能在Google ML中读取HDF5文件,但我可以在使用TFRecords文件格式时读取csv。必须避免对大小为几GB的数据使用文本文件,否则您不会满意。它会放大数据的整体大小,读写速度将远远达不到最佳。好的,我会检查一下