使用deploy.prototxt

时间:2016-05-03 12:00:34

标签: neural-network classification deep-learning caffe pycaffe

我试图让我的分类过程更快一些。我想在deploy.prototxt中增加第一个input_dim,但这似乎不起作用。它比逐个分类每个图像要慢一点。

deploy.prototxt

input: "data"  
input_dim: 128  
input_dim: 1  
input_dim: 120  
input_dim: 160  
... net description ...

python net initialization

net=caffe.Net( 'deploy.prototxt', 'model.caffemodel', caffe.TEST)
net.blobs['data'].reshape(128, 1, 120, 160)
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})
#transformer settings

python分类

images=[None]*128
for i in range(len(images)):
  images[i]=caffe.io.load_image('image_path', False)
for j in range(len(images)):
  net.blobs['data'].data[j,:,:,:] = transformer.preprocess('data',images[j])
out = net.forward()['prob']

我跳过了一些细节,但应该给出重要的东西。我尝试了不同的批量大小,如32,64,...,1024但几乎都一样。所以我的问题是,如果有人知道我做错了什么或需要改变什么? 谢谢你的帮助!

编辑:
一些时间结果,平均时间只是处理过的图像所分配的总时间(1044)。

批量大小:1

  

2016-05-04 10:51:20,721 - 探测器 - 信息 - 数据形状:(1,1,120,160)
  2016-05-04 10:51:35,149 - main - INFO - GPU时间:
  2016-05-04 10:51:35,149 - 主要 - INFO - 处理过的图片:1044
  2016-05-04 10:51:35,149 - 主要 - INFO - 总时间:14.43s
  2016-05-04 10:51:35,149 - 主要 - 信息 - 平均时间:13.82ms
  2016-05-04 10:51:35,149 - main - INFO - 加载时间:8.31s
  2016-05-04 10:51:35,149 - main - INFO - 平均负载时间:7.96ms
  2016-05-04 10:51:35,149 - main - INFO - 分类时间:5.99s
  2016-05-04 10:51:35,149 - main - INFO - avg-classify-time:5.74ms

批量大小:32

  

2016-05-04 10:52:30,773 - 探测器 - 信息 - 数据形状:(32,1,120,160)
  2016-05-04 10:52:45,135 - 主要 - INFO - GPU时间:
  2016-05-04 10:52:45,135 - 主要 - INFO - 处理过的图片:1044
  2016-05-04 10:52:45,135 - 主要 - INFO - 总时间:14.36s
  2016-05-04 10:52:45,136 - 主要 - INFO - 平均时间:13.76ms
  2016-05-04 10:52:45,136 - 主要 - INFO - 加载时间:7.13s
  2016-05-04 10:52:45,136 - 主要 - INFO - 平均负载时间:6.83ms
  2016-05-04 10:52:45,136 - main - INFO - 分类时间:7.13s
  2016-05-04 10:52:45,136 - main - INFO - avg-classify-time:6.83ms

批量大小:128

  

2016-05-04 10:53:17,478 - 探测器 - 信息 - 数据形状:(128,1,120,160)
  2016-05-04 10:53:31,299 - main - INFO - GPU时间:
  2016-05-04 10:53:31,299 - 主要 - INFO - 处理过的图片:1044
  2016-05-04 10:53:31,299 - main - INFO - 总时间:13.82s
  2016-05-04 10:53:31,299 - 主要 - INFO - 平均时间:13.24ms
  2016-05-04 10:53:31,299 - main - INFO - 加载时间:7.06s
  2016-05-04 10:53:31,299 - 主要 - INFO - 平均负载时间:6.77ms
  2016-05-04 10:53:31,299 - main - INFO - 分类时间:6.66s
  2016-05-04 10:53:31,299 - main - INFO - avg-classify-time:6.38ms

批量大小:1024

  

2016-05-04 10:54:11,546 - 探测器 - 信息 - 数据形状:(1024,1,120,160)
  2016-05-04 10:54:25,316 - 主要 - INFO - GPU时间:
  2016-05-04 10:54:25,316 - 主要 - INFO - 已处理的图片:1044
  2016-05-04 10:54:25,316 - main - INFO - 总时间:13.77s
  2016-05-04 10:54:25,316 - 主要 - 信息 - 平均时间:13.19ms
  2016-05-04 10:54:25,316 - main - INFO - 加载时间:7.04s
  2016-05-04 10:54:25,316 - 主要 - INFO - 平均负载时间:6.75ms
  2016-05-04 10:54:25,316 - main - INFO - 分类时间:6.63s
  2016-05-04 10:54:25,316 - main - INFO - avg-classify-time:6.35ms

1 个答案:

答案 0 :(得分:0)

我很确定问题是在行

for j in range(len(images)):
net.blobs['data'].data[j,:,:,:] =   transformer.preprocess('data',images[j])
out = net.forward()['prob']

这样做只会将for循环的最后一次迭代中的单个图像数据设置为网络的唯一输入。尝试事先堆叠N张图片(比如stackedimages),然后只调用一次,例如

for j in range(len(images)):
stackedimages <- transformer.preprocess('data',images[j])

然后打电话,

net.blobs['data'].data[...] =   stackedimages