首页 文章

如何异步加载和训练批次来训练DeepLearning模型?

提问于
浏览
3

我有3TB数据集和64GB RAM以及12核CPU和一个12GB GPU . 我想在这个数据集上培养一个深度学习模型 . 如何进行批量异步加载和模型培训?我想确保磁盘加载数据不会阻止训练循环等待新批量加载到内存中 .

我不依赖于语言,最简单的库可以在没有摩擦的情况下做到这一点,但我更喜欢 torch, pytorch, tensorflow 之一 .

3 回答

  • 3

    我们用上面描述的@ mo-hossny(不是"tied to the Imagenet folder structure")和Keras(tensorflow后端)解决了这个问题,并用血淋淋的细节here进行了描述 .

    简要概述:大多数ML教程都显示了一个目录结构,其中的子目录隐含了训练(和测试)示例类 . 例如,您可能会看到子目录和文件,如 data/train/cats/???.pngdata/train/dogs/???.png 等 .

    相反,如果您创建一个简单的Pandas DataFrame来保存每个火车/测试样本的唯一ID,类标签和文件路径,那么您可以在每个纪元的开始处洗牌此DataFrame,以小批量循环它并使用生成器将每个块发送到GPU . 在后台,CPU保持块的队列已满,等待每个后续的块发送到当前批次后立即发送到GPU .

    这种DataFrame的一个例子是:

    df
    
           object_id   bi  multi                                    path
    index                                                               
     0        461756  dog  white    /path/to/imgs/756/61/blah_461756.png
     1       1161756  cat  black   /path/to/imgs/756/61/blah_1161756.png
     2       3303651  dog  white   /path/to/imgs/651/03/blah_3303651.png
     3       3367756  dog   grey   /path/to/imgs/756/67/blah_3367756.png
     4       3767756  dog   grey   /path/to/imgs/756/67/blah_3767756.png
     5       5467756  cat  black   /path/to/imgs/756/67/blah_5467756.png
     6       5561756  dog  white   /path/to/imgs/756/61/blah_5561756.png
     7      31255756  cat   grey  /path/to/imgs/756/55/blah_31255756.png
     8      35903651  cat  black  /path/to/imgs/651/03/blah_35903651.png
     9      44603651  dog  black  /path/to/imgs/651/03/blah_44603651.png
    10      49557622  cat  black  /path/to/imgs/622/57/blah_49557622.png
    11      58164756  dog   grey  /path/to/imgs/756/64/blah_58164756.png
    12      95403651  cat  white  /path/to/imgs/651/03/blah_95403651.png
    13      95555756  dog   grey  /path/to/imgs/756/55/blah_95555756.png
    

    我已经包含问题的二项式和多项式版本的标签确实证明了相同的DataFrame和文件可以在不同的分类设置中使用 .

    一旦你有了这个,Keras生成器代码非常简短和甜蜜:

    train_generator = generator_from_df(df, batch_size, target_size)
    

    其中df与上面的例子类似,函数generator_from_df()定义为here . 它只是以给定大小的块循环遍历df;读取,标准化和连接块行中指定的像素数据;最后得到(因此发生器)X(像素)和Y(标签)数据 . 它的核心非常类似于:

    i, j = 0, batch_size
    for _ in range(nbatches):
        sub = df.iloc[i:j]
        X = np.array([
            (2 *
             (img_to_array(load_img(f, target_size=target_size))
              / 255.0 - 0.5))
            for f in sub.imgpath])
        Y = sub.target.values
        yield X, Y
        i = j
        j += batch_size
        count += 1
    

    请注意帖子中的引用和代码:我们在Keras页面和Stackoverflow上汇总了其他人的有用提示 .

  • 0

    如果您不想与Imagenet文件夹结构绑定,您可以在每个框架中开发自己的数据加载器 . pytorch示例代码位于https://stackoverflow.com/a/45102798/7387369 . 它在训练时加载下一批 . 将num_workers设置为并行运行的线程数 .

  • 1

    您是否尝试过任何可用的Imagenet代码?

    以指定的格式准备数据 .

    这些不是你想要的吗?

相关问题