CNTK: Как получить класс-вероятности в C ++ - API? - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу получить специфичные для класса вероятности (где сумма всех вероятностей равна 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 Ответ

0 голосов
/ 05 сентября 2018

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

...