【发布时间】:2018-03-20 12:33:37
【问题描述】:
我有大约 5k 个原始数据输入文件和 15k 个原始数据测试文件,总共几个 GB。由于这些是原始数据文件,我必须在 Matlab 中迭代地处理它们,以获得我想要在 (CNN) 上训练我的实际分类器的特征。结果,我为每个原始数据文件生成了一个 HDF5 mat 文件。我使用 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
文件结构是
|
|--train
| |--Class1
| | |-- 2,5k .mat files
| |
| |--Class2
| |-- 2,5k .mat files
|--eval
| |--Class1
| | |-- 2k .mat files
| |
| |--Class2
| |-- 13k .mat files
这是我现在在我的 Google ML 存储桶中的文件结构。它在本地使用带有小模型的 python 工作,但现在我想利用 Google ML 超参数调整功能,因为我的模型要大得多。问题是我在互联网上读到 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
但它给了我类似于 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
但它也不起作用。
问题
如何修改我的脚本以便能够读取 Google ML 中的那些 HDF5 文件?我知道数据酸洗实践,但问题是从 15k 文件(几 GB)创建的泡菜加载到内存似乎效率不高。
【问题讨论】:
-
尝试阅读模式 rb 而不是 r。我猜 r 试图将数据解释为字符串。
-
这就是我尝试过的,它在一定程度上有效,但后来出现了一些错误,我可能会再次检查它。问题是当我从
mat文件中打印字节字符串时,一开始有一行描述了文件属性、创建文件的 Matlab 版本等。 -
格式文件使用docs.scipy.org/doc/scipy/reference/generated/… 这应该是最简单的阅读方式了。为什么你创建了这么多文件而不是创建一个包含所有数据的简单数据集?读起来会很慢,但不是因为hdf5。通过网络访问数据具有很高的延迟。还可以看看stackoverflow.com/a/44961222/4045774 这将显示块大小对 I/O 速度的影响。通过网络,您将需要相当大的块大小才能获得良好的性能。
-
我使用的是别人创建的Matlab脚本,并没有真正看到里面发生了什么
-
如果将“arr = np.fromstring(input_f.read())”替换为“arr = scipy.io.loadmat(input_f.read())”真的不行吗?也试试“arr = scipy.io.loadmat(input_f)”
标签: python tensorflow h5py google-cloud-ml