程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何编写预加载的caffe python数据层?

发布于2019-12-03 17:17     阅读(640)     评论(0)     点赞(30)     收藏(0)


如何在执行其他处理时编写异步数据层以预加载批处理?有一些示例代码吗?谢谢


解决方案


有几种方法可以实现您想要的。我将尝试在此处草绘一个选项。

系统的总体视图是:您已经n Loader异步加载数据并提供了队列。然后,该层batch_size从队列中读取项目,并在forward()函数中提供网络。

import caffe, multiprocessing

class Loader(multiprocessing.Process):
  def __init__(self, outq, *args, **kwargs):
    super(Loader, self).__init__()
    self.daemon = True
    self.outq = outq
    self.start()  # start working

  def run(self):
    while True:  # read and never stop at all!
      try:
        # do your magic here
        # assuming you load x,y pairs
        self.outq.put((x[None, ...], y[None, ...]))  # add singleton "batch" dimension
      except Exception as e:
        # handle errors?
        pass

 class MultiProcessInputLayer(caffe.Layer):
   def setup(self, bottom, top):
     # verify no bottoms, right number of tops etc.
     self.dataQ = multiprocessing.Queue()
     for _ in xrange(n):
       Loader(self.dataQ)  # start n Loaders
     # some other stuff here...

   def reshape(self, bottom, top):
     # reshape the inputs to the right sizes

   def forward(self, bottom, top):
     for i in xrange(batch_size):
       item = self.dataQ.get()
       top[0].data[i, ...] = item[0]
       top[1].data[i, ...] = item[1]

   def backward(self, top, propagate_down, bottom):
     pass  # no backward for data layer

我通过困难的方法学到了一些提示和技巧:
1. 由于GIL的原因,请使用multiprocessing而不是threading打包 2.有时(例如,如果很大)从队列中逐项读取以形成每个批次将花费很长时间在这种情况下,您可以添加另一个将异步从中读取项目并将整个批次写入中的操作然后将只等待一个单一的项目,从每个电话。 3.注意不要过多地复制数据。使用大图像/标签会使所有这些复制成为瓶颈。
batch_sizeforward()multiprocessing.Processbatch_sizeself.dataQself.batchQforward()self.batchQ



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/166400/21dade8e4aae5f9710c6/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)