【发布时间】:2016-12-25 02:26:49
【问题描述】:
在用于图像分类的卷积神经网络架构(例如 VGG 或 AlexNet)中,我想比较计算网络每一层的结果所需的时间,同时在测试时间内进行前向传递(最好使用 Caffe)。
特别是,我很感兴趣在卷积层与全连接层上花费了多少时间。
【问题讨论】:
在用于图像分类的卷积神经网络架构(例如 VGG 或 AlexNet)中,我想比较计算网络每一层的结果所需的时间,同时在测试时间内进行前向传递(最好使用 Caffe)。
特别是,我很感兴趣在卷积层与全连接层上花费了多少时间。
【问题讨论】:
每个caffe层在src/caffe/layersdir中都有一个forward和backward函数,例如src/caffe/layers/pooling_layer.cpp是cpu实现,src/caffe/layers/pooling_layer.cu是gpu实现。所以需要在@987654324的forward函数中添加一个时间函数@ 或 .cu,取决于你使用的是 cpu 还是 gpu。
或者,最简单的方法,使用caffe timecommand
【讨论】:
另一种方法是创建两个网络,一个只有卷积层,一个只有密集(全连接)层。使用卷积网络进行前向传递,测量其时间,将结果(仅卷积网络的输出)传递到全连接网络,进行前向传递并测量其时间。
【讨论】:
那么,你有什么问题。 caffe time 没用?
【讨论】:
如何在net.cpp 中使用class caffe::Timer 来进行这样的测试:
#include "caffe/util/benchmark.hpp" //use class caffe::Timer
Dtype Net<Dtype>::ForwardFromTo(int start, int end) {
... //Some original contents
Timer timer;
for (int i = start; i <= end; ++i) {
...//Some original contents
string layer_name = layers_[i]->layer_param().name(); //get layer name
timer.Start();
Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]);
float forward_time = timer.MicroSeconds();
LOG(ERROR) << layer_name << " consumes: " << forward_time << " microseconds during forward.";
...
}
return loss;
}
【讨论】: