如何处理Google云机器学习中大量的HDF5文件?

2024-04-26 06:46:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大约5k的原始数据输入文件和15k的原始数据测试文件,总共有几GB。因为这些是原始数据文件,我不得不在Matlab中迭代处理它们,以获得我想要在上面训练我的实际分类器(CNN)的特征。因此,我为每个原始数据文件生成了一个HDF5mat文件。我使用Keras在本地开发了我的模型,并修改了DirectoryIterator,其中我有如下内容

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

文件结构是

^{pr2}$

这是我现在在googleml存储桶中的文件结构。它在本地使用一个小模型与python一起工作,但是现在我想利用googlemlhyperparams调优功能,因为我的模型要大得多。问题是,我在互联网上读到,HDF5文件无法从googleml存储直接轻松地读取。我试着这样修改我的脚本:

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

但它给我的错误与error UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte相似,只是用其他十六进制和位置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

但也不管用。在

问题
我如何修改我的脚本来读取googleml中的HDF5文件?我知道数据酸洗实践,但问题是,将15k文件(几GB)创建的pickle加载到内存中似乎不是很有效。在


Tags: 文件inio模型importselfforinput
2条回答

HDF是一种非常常见的文件格式,不幸的是,它在云中不是最佳的。有关原因的解释,请参阅this博客文章。在

考虑到云上HDF固有的复杂性,我推荐以下方法之一:

  1. 将数据转换为其他文件格式,如CSV或TFRecord oftf.示例在
  2. 将数据本地复制到/tmp

转换充其量是不方便的,而且,对于一些数据集,也许体操将是必要的。在互联网上粗略地搜索了一下,发现了很多关于如何这样做的教程。Here's one你可以参考一下。在

同样,有多种方法可以将数据复制到本地计算机上,但是要注意,在数据被复制之前,您的工作不会开始进行任何实际的培训。另外,如果其中一个工人死了,它将不得不在重新启动时重新复制所有数据。如果大师死了,而你正在进行分布式训练,这可能会导致大量工作的损失。在

也就是说,如果您觉得这是一种可行的方法(例如,您没有进行分布式培训和/或您愿意像上面描述的那样等待数据传输),只需从以下内容开始您的Python:

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']) 

从类似对象的临时文件读取数据

我不能直接访问googleml,所以如果这个答案不起作用,我必须道歉。我做了类似的事情直接从压缩文件夹读取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)

相关问题 更多 >