gpt4 book ai didi

python - CNTK:如何获取C++-API中的类概率?

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:56 26 4
gpt4 key购买 nike

我想从 cntk 中训练有素的 cnn 中获取类特定概率(所有概率之和等于 1)。在 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 函数?

提前致谢并致以最诚挚的问候

最佳答案

好的,我自己解决了这个问题。当我在训练之前将模型传递给 softmax 函数并使用返回的 softmax 模型训练网络时,它起作用了。

关于python - CNTK:如何获取C++-API中的类概率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52186821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com