3

我试图让我的分类过程更快一点。我想增加我的 deploy.prototxt 中的第一个 input_dim 但这似乎不起作用。它甚至比一张一张地对每个图像进行分类要慢一点。

部署.prototxt

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

python网络初始化

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

蟒蛇分类

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 -主要- 信息 - GPU 计时:
2016-05-04 10:51:35,149 -主要- 信息 - 处理后的图像:1044
2016-05-04 10:51:35,149 -主要- 信息 - 总时间:14.43 秒
2016-05-04 10:51:35,149 -主要- 信息 -平均时间:13.82 毫秒
2016 年 5 月 4 日 10:51:35,149 -主要- 信息 - 加载时间:8.31 秒 2016
年 5 月 4 日 10:51:35,149 -主要- 信息 - 平均加载时间:7.96 毫秒
2016-05-04 10:51:35,149-主要-信息-分类时间:5.99s
2016-05-04 10:51:35,149-主要- 信息 - 平均分类时间:5.74 毫秒

批量:32

2016-05-04 10:52:30,773-检测器-信息-数据形状:(32、1、120、160)
2016-05-04 10:52:45,135-主要-信息-GPU 计时:
2016-05-04 10:52:45,135 -主要- 信息 - 处理后的图像:1044
2016-05-04 10:52:45,135 -主要- 信息 - 总时间:14.36 秒
2016-05-04 10:52:45,136 -主要- 信息 -平均时间:13.76 毫秒
2016-05-04 10:52:45,136 -主要- 信息 - 加载时间:7.13 秒
2016-05-04 10:52:45,136 -主要- 信息 - 平均加载时间:6.83 毫秒
2016-05-04 10:52:45,136-主要-信息-分类时间:7.13s
2016-05-04 10:52:45,136-主要- 信息 - 平均分类时间:6.83 毫秒

批量:128

2016-05-04 10:53:17,478 - 检测器 - 信息 - 数据形状:(128, 1, 120, 160)
2016-05-04 10:53:31,299 -主要- 信息 - GPU 计时:
2016-05-04 10:53:31,299 -主要- 信息 - 处理的图像:1044
2016-05-04 10:53:31,299 -主要- 信息 - 总时间:13.82 秒
2016-05-04 10:53:31,299 -主要- 信息 -平均时间:13.24 毫秒 2016
年 5 月 4 日 10:53:31,299 -主要- 信息 - 加载时间:7.06 秒 2016
年 5 月 4 日 10:53:31,299 -主要- 信息 - 平均加载时间:6.77 毫秒
2016-05-04 10:53:31,299-主要-信息-分类时间:6.66s
2016-05-04 10:53:31,299-主要- 信息 - 平均分类时间:6.38 毫秒

批量:1024

2016-05-04 10:54:11,546 - 检测器 - 信息 - 数据形状:(1024, 1, 120, 160)
2016-05-04 10:54:25,316 -主要- 信息 - GPU 计时:
2016-05-04 10:54:25,316 -主要- 信息 - 处理的图像:1044
2016-05-04 10:54:25,316 -主要- 信息 - 总时间:13.77 秒
2016-05-04 10:54:25,316 -主要- 信息 -平均时间:13.19 毫秒
2016-05-04 10:54:25,316 -主要- 信息 - 加载时间:7.04 秒
2016-05-04 10:54:25,316 -主要- 信息 - 平均加载时间:6.75 毫秒
2016-05-04 10:54:25,316-主要-信息-分类时间:6.63s
2016-05-04 10:54:25,316-主要- 信息 - 平均分类时间:6.35 毫秒

4

1 回答 1

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
于 2016-05-03T19:46:22.847 回答