У меня есть программа, которую я модифицировал для извлечения некоторых данных.
Недавно я сделал еще одно извлечение данных и использовал обходной путь из-за нехватки времени.
Теперь я пытаюсь найти, чтопроблема была, потому что у меня есть немного свободного времени.
Ниже представлена функция Act (), которая является функцией-членом класса Mat, и она формирует новую матрицу с измененными значениями данных.Мат имеет указатель на буфер, содержащий фактические данные.Я обнаружил, что после функции Act (), которая возвращает матрицу, вызывается функция operator =.(не было никакой функции 'operator =', поэтому я добавил ее. возможно, использовалось значение по умолчанию '= operator'. С моей добавленной функцией 'operator =' или без нее она не выдает окончательный правый результат) Вот частьОператор '=', который возвращает данные (тип Mat). (это код на C ++, но я просто использовал printf, потому что он все равно работает)
template<typename T>
Mat<T> Mat<T>::operator = (const Mat<T>& rhs)
{
Mat<T> result(rhs.row_, rhs.col_);
int num_bytes = sizeof(T) * rhs.row_ * rhs.col_;
printf("ope = , res val = %x, src val = %x, row = %d, col = %d\n", result.val_, rhs.val_, rhs.row_, rhs.col_);
for(int i=0;i<10;i++){
printf("%04x ",((half_float::half *)rhs.val_)[i].data_);
}
printf("\n");
memcpy(result.val_, rhs.val_, num_bytes);
for(int i=0;i<10;i++){
printf("%04x ",((half_float::half *)result.val_)[i].data_);
}
printf("\n");
return result;
}
ope =, res val = 12199b0, src val =c07680, строка = 128, col = 128
3be0 bbfc bbf5 3bf8 3af0 bbf6 bbef b29f bbaf 3bfd
3be0 bbfc bbf5 3bf8 3af0 bbf6 bbef b29f bbaf 3bfd
1010это правильный шаблон.
Вызывающая часть выглядит следующим образом.
printf("calling activation..\n");
d0_out = d0_out.Act(NN_CELL::AT_TANH);
std::cout << "MLP Layer 0 executed." << std::endl;
for(int i=0;i<10;i++){
printf("%04x ",((half_float::half *)d0_out.val_)[i].data_);
}
printf("\n");
Но после назначения, видимого из основной функции, данные странные.
Выполнен слой MLP 0.
40de c2e2 c1eb 425e 3d4a c21b c187 b2b8 bfce 4358
Как видите, данные неверны.
Единственный способ, которым я могу произвести правильновывод использует новый объект и присваивает ему результат функции Act ().
NN_CELL::Mat<T> d0_out1 = d0_out.Act(NN_CELL::AT_TANH); // tmp work-around
Тогда d0_out1 (новый объект) содержит правильные данные (3be0 bbfc bbf5 ..) вместо оригинальных
d0_out = d0_out.Act(NN_CELL::AT_TANH);
Что не так с исходным кодом?