2017-05-01 1 views
0

Dies ist nur eine C++ - Syntax Syntaxfrage (denke ich). Ich habe 192 Schwimmer in einer Struktur wie:Programmierung Syntax Frage Verwendung von CNTKLibrary aus C++

Std :: Vektor outputData (192);

Ich mag die eingebauten in Softmax Funktion im CNTKLibrary rufe auf diesem Vektor 192x1 - die Dokumentation in der Header-Datei ist:

/// eine Instanz des eingebauten in CNTK erstellen softmax Betriebes auf spezifizierter Tensor-Eingabeoperand CNTK_API FunctionPtr Softmax (const Variable & Operand, const std :: wstring & Name = L "");

Wie mache ich das? Ich denke zuerst bekomme ich den Funktionszeiger, und dann wende ich ihn an, aber ich verstehe nicht, wie die Syntax sein würde. So etwas wie dies ...

// Schnappen Softmax Funktionszeiger

FunctionPtr SoftmaxFuncPtr = Softmax (Output); // wie man arg wirft?

// Wie bewertet man diese FuntionPtr?

SoftmaxFuncPtr-> eval(); // WAG - Ich habe keine Ahnung ...

Wohin geht das Ergebnis der Berechnung?

Dank, wenn Sie mir einige Hinweise geben kann ...

+0

Bitte lesen [this] (https://stackoverflow.com/editing-help#code), dann stellen Sie sicher, dass Ihre Frage aussieht, wie Sie es aussehen wollen. Verwenden Sie den Vorschaubereich unter Ihrem Bearbeitungsfeld. –

Antwort

1

Zuerst müssen Sie eine Variable für die Eingabe von Softmax, so etwas wie definieren:

auto inputVar = InputVariable(DimensionsOfInput, DataType::Float, L"InputSoftMax"); 

Dann Sie eine Composite-Funktion bauen mit softmax, wie

FunctionPtr SoftmaxFuncPtr = Softmax(inputVar, L"SoftMax"); 
auto EvalFuncPtr = AsComposite(SoftmaxFuncPtr, L"EvalSoftMax"); 

danach konstruieren Eingangs- und Ausgangskartendaten zur Auswertung herzustellen, und dann die Rufumleitung() oder Bewerten() Auswertung auf den Eingabedaten auszuführen und GE t Ausgabeergebnis.

Das Beispiel MultiThreadsEvaluationWithNewFunction() in EvalMultithreads.cpp zeigt, wie eine neue Funktion für die Auswertung erstellt wird. Die page beschreibt, wie diese Beispiele zu verwenden sind. Die Funktion dort enthält mehrere Ebenen und unterstützt die Auswertung mit Multithreads, so dass sie Code haben kann, der für Ihren Fall nicht benötigt wird. Und das Beispiel verwendet immer noch Low-Level-APIs, um Eingabe- und Ausgabedaten zu manipulieren, und wir haben auch praktische Methoden auf hoher Ebene, wie Value :: CreateBatch/Sequence/BatchOfSequence(), Value :: CopyVariableValueTo(), um Ihnen bei der Vorbereitung von Eingaben zu helfen/Daten ausgeben, ohne Low-Level-Details zu kennen. Die CNTKLibrary.h hat auch eine Beschreibung dieser APIS.

Bitte lassen Sie uns Ihre Fragen wissen. Danke,

+0

Hmmm ... OK, ich versuche, die ganze Syntax und Bedeutung herauszufinden ... es scheint kompliziert zu sein, weil CNTK eingerichtet ist, um beliebige Tensoren usw. zuzulassen. Ich würde wirklich gerne einen Anruf machen wie dies: Std: Vektor Antwort = Softmax (outputData); aber es scheint so, als müsste ich etwas tun (siehe nächster Beitrag) ... – Tullhead

+0

// Definieren Sie eine Eingabevariable \t NDShape DimensionsOfInput (1, ntot); \t auto inputVar = Eingabevariable (DimensionsOfInput, DataType :: Float, L "InputSoftMax"); \t Std :: Vektor inputData (inputVar.Shape(). TotalSize()); \t // die Eingangsgröße mit Daten \t für füllen (i = 0; i GetAt (i); \t } \t // Erzeugt zusammengesetzte Funktion \t FunctionPtr SoftmaxFuncPtr = Softmax (InputVar, L "SoftMax"); \t auto EvalFuncPtr = AsComposite (SoftmaxFuncPtr, L "EvalSoftMax"); \t ... Fortsetzung folgt ... – Tullhead

+0

// input erstellen ValuePtr \t ValuePtr Inputvalue = MakeSharedObject (MakeSharedObject (inputVar.Shape(), EingDaten, true)); // do I ‚Shared“ brauchen \t // Ausgabe ValuePtr \t ValuePtr Output schaffen;? \t auto OutputVar = EvalFuncPtr-> Ausgabe(); \t std :: unordered_map Ausgänge = {{ OutputVar, Output}}; \t // gelten die Funktion \t EvalFuncPtr-> Forward ({{InputVar, Inputvalue}}, Ausgänge); \t // den Ausgangswert erhalten \t Output = Ausgänge [OutputVar]; \t // etwas anderes tun, um das outputData-Array aus dem outputValue zu extrahieren – Tullhead