Python — CNTK: Как получить вероятности класса в C ++ — API?

Я хочу получить специфичные для класса вероятности (где сумма всех вероятностей равна 1) от обученного cnn в cntk. В Python это работает, как и ожидалось, применяя softmax-функцию:

import cntk as C
from skimage import io

model_path = "..."image_path = "..."image = io.imread(image_path)
model = C.load_model(model_path)
sm_classifier = C.softmax(model)
class_prob = sm_classifier.eval({model.arguments[0]: [image]})

Здесь class_prob — это двумерный массив numpy, который содержит значения, которые кажутся желаемыми вероятностями класса.

В C ++ у меня есть следующий код:

std::vector<std::vector<float>> CnnClassifier::evaluateNet(std::vector<float> flattenedImage)
{
CNTK::FunctionPtr classifier = CNTK::Softmax(m_cnn); // m_cnn is of type CNTK::FunctionPtr

// Get input variable. The model has only one single input.
CNTK::Variable inputVar = m_cnn->Arguments()[0];

// The model has only one output.
// If the model has more than one output, use modelFunc->Outputs to get the list of output variables.
CNTK::Variable outputVar = m_cnn->Output();

CNTK::ValuePtr inputVal = CNTK::Value::CreateBatch(inputVar.Shape(), flattenedImage, m_device);

std::unordered_map<CNTK::Variable, CNTK::ValuePtr> inputDataMap = { { inputVar, inputVal } };
std::unordered_map<CNTK::Variable, CNTK::ValuePtr> outputDataMap = { { outputVar, nullptr } };

classifier->Evaluate(inputDataMap, outputDataMap, m_device);

CNTK::ValuePtr outputVal = outputDataMap[outputVar];
std::vector<std::vector<float>> outputData;
outputVal->CopyVariableValueTo(outputVar, outputData);

return outputData;
}

В outputData нет значений для каждого класса, которые складываются до 1. Значения, которые он содержит, могут быть очень высокими (до 15 в моих примерах), а также могут быть полезными. Я полагаю, что это «необработанные» выходные значения последнего полностью подключенного слоя. Как я могу применить к ним функцию softmax?

Спасибо заранее и наилучшими пожеланиями

1

Решение

Хорошо, я решил проблему сам. Это сработало, когда я передал модель функции softmax ДО тренировки и обучил сеть с возвращенной моделью softmax.

0

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

Других решений пока нет …