batch scoring in cpp
- Lenguaje dominante
- C++
- Estrellas
- 115
- Forks
- 78
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
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 args_map;
map aux_map;
map parameters;
NDArray::Load("../Resnet/resnet-152-0000.params", 0, ¶meters);
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 args_map;
map 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();
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
Start by reproducing the two paths in the issue with the ResNet symbol and parameter files, then trace the C++ NDArray::Load, Symbol::SimpleBind, and executor setup calls used by each method. Compare the resulting argument maps and batch handling, and define done as identifying the segmentation-fault cause and documenting which batch-scoring approach is valid and why.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- cpp
- Área
- machine-learning
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Necesita aclaración
- Aptitud para principiantes
- 30/100