Я хочу получить специфичные для класса вероятности (где сумма всех вероятностей равна 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?
Спасибо заранее и наилучшими пожеланиями
Хорошо, я решил проблему сам. Это сработало, когда я передал модель функции softmax ДО тренировки и обучил сеть с возвращенной моделью softmax.
Других решений пока нет …