MXNet.cpp icon indicating copy to clipboard operation
MXNet.cpp copied to clipboard

batch scoring in cpp

Open patricianing opened this issue 8 years ago • 1 comments

I am trying to load a pre-built model and do batch scoring, I tried the following two ways, the first one can produce some results, and the second one compiles successfully but runs with segmentation fault. Could you please let me know which way I should follow, and why the second way doesn't work? Thanks! method 1:

/* Image size and channels */
int width = 224;
int height = 224;
int channels = 3;
int batch_size = 5;

Context ctx_dev(DeviceType::kCPU, 0); map<string, NDArray> args_map; map<string, NDArray> aux_map; map<string, NDArray> parameters;

NDArray::Load("../Resnet/resnet-152-0000.params", 0, &parameters);

for (const auto &k : parameters) {
  if (k.first.substr(0, 4) == "aux:") {
    auto name = k.first.substr(4, k.first.size() - 4);
    aux_map[name] = k.second.Copy(ctx_dev);
  }
  if (k.first.substr(0, 4) == "arg:") {
    auto name = k.first.substr(4, k.first.size() - 4);
    args_map[name] = k.second.Copy(ctx_dev);
  }
}

auto net = Symbol::Load("../Resnet/resnet-152-symbol.json");

auto data_iter = MXDataIter("ImageRecordIter") .SetParam("path_imglist","../caltech_256/caltech-256-60-train.lst") .SetParam("path_imgrec","../caltech_256/caltech-256-60-train.rec") .SetParam("data_shape", Shape(3, 224, 224)) .SetParam("batch_size", batch_size) .SetParam("shuffle", 1) .CreateDataIter();

while(data_iter.Next()){ auto batch = data_iter.GetData(); args_map["data"] = batch; auto *exec = net.SimpleBind(ctx_dev, args_map); exec->Forward(false); auto outputs = exec->outputs[0].Copy(Context(kCPU, 0)); NDArray::WaitAll(); for (int i = 0; i <2; i++) { cout << outputs.At(0, i) <<","; } cout << endl; } MXNotifyShutdown();

method 2:

int width = 224; int height = 224; int channels = 3; int batch_size = 5;

Context ctx_dev(DeviceType::kCPU, 0);

map<string, NDArray> args_map;
map<string, NDArray> aux_map;

args_map["data"] = NDArray(Shape(batch_size, channels, width, height), ctx_dev);
args_map["label"] = NDArray(Shape(batch_size), ctx_dev);

auto net = Symbol::Load("../Resnet/resnet-152-symbol.json");

auto *exec = net.SimpleBind(ctx_dev, args_map);

NDArray::Load("../Resnet/resnet-152-0000.params", 0, &args_map);

auto data_iter = MXDataIter("ImageRecordIter")
  .SetParam("path_imglist","../caltech_256/caltech-256-60-train.lst")
  .SetParam("path_imgrec","../caltech_256/caltech-256-60-train.rec")
  .SetParam("data_shape", Shape(3, 224, 224))
  .SetParam("batch_size", batch_size)
  .SetParam("shuffle", 1)
  .CreateDataIter();

while(data_iter.Next()){ auto batch = data_iter.GetDataBatch(); batch.data.CopyTo(&args_map["data"]); batch.label.CopyTo(&args_map["label"]); exec->Forward(false); NDArray::WaitAll(); }

delete exec;
MXNotifyShutdown();

patricianing avatar Apr 20 '17 22:04 patricianing

hey , man . , i have the same problem. did you solve it ?

gongxijun avatar Jan 30 '18 07:01 gongxijun