Я пытаюсь реализовать пользовательскую функцию потерь в Mxnet, используя ее C ++ API. Вопрос о функции потерь уже поднимался в python (как использовать настраиваемую функцию потерь с mxnet?), хотя это не решает конкретный вопрос вывода.
Допустим, я хочу создать свою собственную функцию softmax, я мог бы сделать следующее:
Symbol expFc2 = exp(fc2);
Symbol sumExp = sum("sumExp", expFc2, dmlc::optional<Shape>(Shape(1)));
Symbol expandedSumExp = expand_dims("expandedSumExp", sumExp, 1);
Symbol customSoftmax = broadcast_div(expFc2, expandedSumExp);
Symbol cross_entropy = (-1) * (one_hot("OneHotDataLabel", data_label, 10) * log(customSoftmax) + (1 - one_hot("OneHotDataLabel", data_label, 10)) * log(1 - customSoftmax));
Symbol lenet = MakeLoss(cross_entropy);
Однако всякий раз, когда я получаю вывод, auto curOutput = exe->outputs;
Я, кажется, получаю значение после вычисления функции потерь, которая будет cross_entropy
,
Как получить результат customSoftmax
вычисление?
Нет API для доступа к промежуточным выводам в графе вычислений. Это по причинам оптимизации. Любой вывод, который вам нужен, должен быть возвращен как вывод графика. Вы можете использовать mx.symbol.Group для возврата нескольких символов в качестве вывода.
Вот это пример Python. Вы должны быть в состоянии сделать то же самое в C ++.
Других решений пока нет …