我有大约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加载到内存中似乎不是很有效。在
HDF是一种非常常见的文件格式,不幸的是,它在云中不是最佳的。有关原因的解释,请参阅this博客文章。在
考虑到云上HDF固有的复杂性,我推荐以下方法之一:
转换充其量是不方便的,而且,对于一些数据集,也许体操将是必要的。在互联网上粗略地搜索了一下,发现了很多关于如何这样做的教程。Here's one你可以参考一下。在
同样,有多种方法可以将数据复制到本地计算机上,但是要注意,在数据被复制之前,您的工作不会开始进行任何实际的培训。另外,如果其中一个工人死了,它将不得不在重新启动时重新复制所有数据。如果大师死了,而你正在进行分布式训练,这可能会导致大量工作的损失。在
也就是说,如果您觉得这是一种可行的方法(例如,您没有进行分布式培训和/或您愿意像上面描述的那样等待数据传输),只需从以下内容开始您的Python:
从类似对象的临时文件读取数据
我不能直接访问googleml,所以如果这个答案不起作用,我必须道歉。我做了类似的事情直接从压缩文件夹读取h5文件,但我希望这将在这里工作。在
相关问题 更多 >
编程相关推荐