Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 谷歌云机器学习中如何处理大量HDF5文件?_Python_Tensorflow_H5py_Google Cloud Ml - Fatal编程技术网

Python 谷歌云机器学习中如何处理大量HDF5文件?

Python 谷歌云机器学习中如何处理大量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

我有大约5k的原始数据输入文件和15k的原始数据测试文件,总共有几GB。由于这些是原始数据文件,我必须在Matlab中迭代处理它们,以获得我想要在(CNN)上训练实际分类器的特征。结果,我为每个原始数据文件生成了一个HDF5
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固有的复杂性,我推荐以下方法之一:

  • 将数据转换为其他文件格式,如CSV或tf的TFRecord。示例
  • 将数据本地复制到/tmp
  • 转换充其量是不方便的,而且,对于某些数据集来说,也许体操是必要的。在互联网上进行的粗略搜索显示了多个关于如何做到这一点的教程。你可以参考

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

    这就是说,如果您觉得这是一种在您的情况下可行的方法(例如,您没有进行分布式培训和/或您愿意如上所述等待数据传输),只需从以下内容开始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']) 
    

    从临时文件(如对象)读取数据

    我不能直接访问谷歌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的数据使用文本文件,否则您不会满意。它会放大数据的整体大小,读写速度将远远达不到最佳。好的,我会检查一下