Как использовать NDArray в C ++ API?

Я меняю пример c ++ в mxnet. Я не понимаю, как выделить объект NDArray. Вокруг нет даже базовой документации, что довольно неприятно.

Я пытаюсь выделить NDArray, но, объявляя экземпляр, он, кажется, не выделяет данные, только когда я заполняю массив данными. Это верно?

// this code snippet does not work
NDArray a = NDArray(Shape(10, 20), Context::cpu());
const float *dat = a.GetData();
float result = *dat; // read memory violation
result = *(dat + 10);

// this code snippet works
NDArray b = NDArray(Shape(10, 20), Context::cpu());
a.SampleUniform(1.0, 2.0, &b);
const float *dat2 = b.GetData();
float result2 = *dat2; // works!!
result2 = *(dat2 + 10);

У кого-нибудь есть опыт работы с c ++ API и меняющимися сетями?

0

Решение

есть третий аргумент delay_alloc:
https://github.com/apache/incubator-mxnet/blob/master/cpp-package/include/mxnet-cpp/ndarray.h#L144

Установите значение false, ваш код будет работать.

1

Другие решения

Прошло много времени с тех пор, как вопрос был опубликован. Вот мой ответ, если это кому-нибудь поможет.

Вы определяете данные, которые будут установлены с помощью std::vector и матрица Shape который хранит данные из вектора.

  std::vector<mx_float> v {1.23, 4.56, 7.89, 5.71};

// populates v vector data in a matrix of 1 row and 4 columns
// mxnet::cpp::NDArray nda_array {v, Shape{1,4}, m_ctx};

// populates v vector data in a matrix of 2 rows and 2 columns
// where v[3] and v[4] are populated in second row
mxnet::cpp::NDArray nda_array {v, Shape{2,2}, m_ctx};

assert(nda_array.Size() == 4);

assert(nda_array.At(0, 0) == v[0]);
assert(nda_array.At(0, 1) == v[1]);
assert(nda_array.At(1, 0) == v[2]);
assert(nda_array.At(1, 1) == v[3]);
0

По вопросам рекламы [email protected]