如何在训练多类 CNN 模型时存储和加载包含 5000 万个 25x25 numpy 数组的训练数据?

0x9*_*x90 5 python deep-learning keras tensorflow pytorch

我有一个图像处理问题,其中有五个类,每个类有大约 1000 万个示例作为训练数据,其中图像是 z 得分的 25x25 numpy 数组。

显然,我无法将所有训练数据加载到内存中,因此我必须使用fit_generator.

我也是生成和扩充这些训练数据矩阵的人,但我无法实时进行,fit_generator因为训练模型太慢了。

首先,如何在磁盘上存储 5000 万个 25x25 .npy 数组?最好的做法是什么?

其次,我应该使用数据库来存储这些矩阵并在训练期间从中查询吗?我认为 SQLite 不支持多线程,并且 SQL 数据集支持在 tensorflow 中仍处于试验阶段。

我很想知道是否有一种巧妙的方法来存储这 5000 万个矩阵,以便在训练期间进行检索是最佳的。

三、使用HDF5格式怎么样?我应该改用pytorch吗?

0x9*_*x90 0

这是我在媒体上找到的一些代码(找不到原始帖子)。

这将有助于以生产者-消费者的方式动态生成训练数据:

import tensorflow as tf
import numpy as np

from time import sleep

class DataGen():
    counter = 0

    def __init__(self):
        self.gen_num = DataGen.counter
        DataGen.counter += 1

    def py_gen(self, gen_name):
        gen_name = gen_name.decode('utf8') + '_' + str(self.gen_num)
        for num in range(10):
            sleep(0.3)
            yield '{} yields {}'.format(gen_name, num)

Dataset = tf.data.Dataset
dummy_ds = Dataset.from_tensor_slices(['Gen1', 'Gen2', 'Gen3'])
dummy_ds = dummy_ds.interleave(lambda x: Dataset.from_generator(DataGen().py_gen, output_types=(tf.string), args=(x,)),
                               cycle_length=5,
                               block_length=2,
                               num_parallel_calls=5)
data_tf = dummy_ds.as_numpy_iterator()
for d in data_tf:
  print(d)
Run Code Online (Sandbox Code Playgroud)

输出:

b'Gen1_0 yields 0'
b'Gen1_0 yields 1'
b'Gen2_0 yields 0'
b'Gen2_0 yields 1'
b'Gen3_0 yields 0'
b'Gen3_0 yields 1'
b'Gen1_0 yields 2'
b'Gen1_0 yields 3'
b'Gen2_0 yields 2'
b'Gen2_0 yields 3'
b'Gen3_0 yields 2'
b'Gen3_0 yields 3'
b'Gen1_0 yields 4'
b'Gen1_0 yields 5'
b'Gen2_0 yields 4'
b'Gen2_0 yields 5'
b'Gen3_0 yields 4'
b'Gen3_0 yields 5'
b'Gen1_0 yields 6'
b'Gen1_0 yields 7'
b'Gen2_0 yields 6'
b'Gen2_0 yields 7'
b'Gen3_0 yields 6'
b'Gen3_0 yields 7'
b'Gen1_0 yields 8'
b'Gen1_0 yields 9'
b'Gen2_0 yields 8'
b'Gen2_0 yields 9'
b'Gen3_0 yields 8'
b'Gen3_0 yields 9'
Run Code Online (Sandbox Code Playgroud)