【问题标题】:How to measure time of executation of each layer in CNNs如何测量CNN中每一层的执行时间
【发布时间】:2016-12-25 02:26:49
【问题描述】:

在用于图像分类的卷积神经网络架构(例如 VGG 或 AlexNet)中,我想比较计算网络每一层的结果所需的时间,同时在测试时间内进行前向传递(最好使用 Caffe)。

特别是,我很感兴趣在卷积层与全连接层上花费了多少时间。

【问题讨论】:

    标签: conv-neural-network


    【解决方案1】:

    每个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

    【讨论】:

      【解决方案2】:

      另一种方法是创建两个网络,一个只有卷积层,一个只有密集(全连接)层。使用卷积网络进行前向传递,测量其时间,将结果(仅卷积网络的输出)传递到全连接网络,进行前向传递并测量其时间。

      【讨论】:

        【解决方案3】:

        那么,你有什么问题。 caffe time 没用?

        【讨论】:

          【解决方案4】:

          如何在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;
          }
          

          【讨论】:

            最近更新 更多