@@ -64,6 +64,8 @@ DEFINE_string(listen_address, "",
6464DEFINE_int32 (comm_threads, 1 ,
6565    " Optional; multinode mode," 
6666    "  The number of threads used by communication code."  );
67+ DEFINE_bool (forward_only, false ,
68+     " Optional; Execute only forward pass"  );
6769
6870//  A simple registry for caffe commands.
6971typedef  int  (*BrewFunction)();
@@ -409,8 +411,10 @@ int time() {
409411  float  initial_loss;
410412  caffe_net.Forward (&initial_loss);
411413  LOG (INFO) << " Initial loss: "   << initial_loss;
412-   LOG (INFO) << " Performing Backward"  ;
413-   caffe_net.Backward ();
414+   if  (!FLAGS_forward_only){
415+     LOG (INFO) << " Performing Backward"  ;
416+     caffe_net.Backward ();
417+   }
414418
415419  const  vector<shared_ptr<Layer<float > > >& layers = caffe_net.layers ();
416420  const  vector<vector<Blob<float >*> >& bottom_vecs = caffe_net.bottom_vecs ();
@@ -438,34 +442,43 @@ int time() {
438442      forward_time_per_layer[i] += timer.MicroSeconds ();
439443    }
440444    forward_time += forward_timer.MicroSeconds ();
441-     backward_timer.Start ();
442-     for  (int  i = layers.size () - 1 ; i >= 0 ; --i) {
443-       timer.Start ();
444-       layers[i]->Backward (top_vecs[i], bottom_need_backward[i],
445-                           bottom_vecs[i]);
446-       backward_time_per_layer[i] += timer.MicroSeconds ();
445+     if  (!FLAGS_forward_only) {
446+       backward_timer.Start ();
447+       for  (int  i = layers.size () - 1 ; i >= 0 ; --i) {
448+         timer.Start ();
449+         layers[i]->Backward (top_vecs[i], bottom_need_backward[i],
450+                             bottom_vecs[i]);
451+         backward_time_per_layer[i] += timer.MicroSeconds ();
452+       }
453+       backward_time += backward_timer.MicroSeconds ();
454+       LOG (INFO) << " Iteration: "   << j + 1  << "  forward-backward time: " 
455+         << iter_timer.MilliSeconds () << "  ms."  ;
456+     } else  {
457+       LOG (INFO) << " Iteration: "   << j + 1  << "  forward time: " 
458+         << iter_timer.MilliSeconds () << "  ms."  ;
447459    }
448-     backward_time += backward_timer.MicroSeconds ();
449-     LOG (INFO) << " Iteration: "   << j + 1  << "  forward-backward time: " 
450-       << iter_timer.MilliSeconds () << "  ms."  ;
451460  }
452461  LOG (INFO) << " Average time per layer: "  ;
453462  for  (int  i = 0 ; i < layers.size (); ++i) {
454463    const  caffe::string& layername = layers[i]->layer_param ().name ();
455464    LOG (INFO) << std::setfill ('  '  ) << std::setw (10 ) << layername <<
456465      " \t forward: "   << forward_time_per_layer[i] / 1000  /
457466      FLAGS_iterations << "  ms."  ;
458-     LOG (INFO) << std::setfill ('  '  ) << std::setw (10 ) << layername  <<
459-       " \t backward: "   << backward_time_per_layer[i] / 1000  /
460-       FLAGS_iterations << "  ms."  ;
467+     if  (!FLAGS_forward_only) {
468+       LOG (INFO) << std::setfill ('  '  ) << std::setw (10 ) << layername  <<
469+         " \t backward: "   << backward_time_per_layer[i] / 1000  /
470+         FLAGS_iterations << "  ms."  ;
471+     }
461472  }
462473  total_timer.Stop ();
463474  LOG (INFO) << " Average Forward pass: "   << forward_time / 1000  /
464475    FLAGS_iterations << "  ms."  ;
465-   LOG (INFO) << " Average Backward pass: "   << backward_time / 1000  /
466-     FLAGS_iterations << "  ms."  ;
467-   LOG (INFO) << " Average Forward-Backward: "   << total_timer.MilliSeconds () /
468-     FLAGS_iterations << "  ms."  ;
476+   if  (!FLAGS_forward_only) {
477+     LOG (INFO) << " Average Backward pass: "   << backward_time / 1000  /
478+       FLAGS_iterations << "  ms."  ;
479+     LOG (INFO) << " Average Forward-Backward: "   << total_timer.MilliSeconds () /
480+       FLAGS_iterations << "  ms."  ;
481+   }
469482  LOG (INFO) << " Total Time: "   << total_timer.MilliSeconds () << "  ms."  ;
470483  LOG (INFO) << " *** Benchmark ends ***"  ;
471484  return  0 ;
0 commit comments