|
Dank der großartigen neuen Array-Slicing-Fähigkeiten von NumSharp ist die .NET-Community einen Schritt näher daran, eine leistungsstarke Open-Source-Plattform für maschinelles Lernen zu haben. Python ist eine Programmiersprache zum Beispiel, weil es großartige Bibliotheken wie NumPy und TensorFlow hat. Allerdings haben C#-Entwickler auch einen großen Bedarf an leistungsstarken Open-Source-Bibliotheken für maschinelles Lernen und Data Science. NumSharp, der NumPy C#-Port der SciSharp STACK-Organisation, hat kürzlich einen großen Schritt nach vorne gemacht, indem es Slicing-Fähigkeiten vollständig implementiert hat, was die Erstellung beliebiger Teilmengen von N-dimensionalen Arrays als effiziente Ansichten von Rohdaten ermöglicht. Das macht es zu einem nützlichen Werkzeug, um C# im maschinellen Lernen zusammen mit TensorFlow.NET zu verwenden.
Was ist daran so schlimm?
Wenn du NumPy noch nicht benutzt hast, weißt du wahrscheinlich nicht, wie großartig das Slicen ist. Python-Arrays erlauben es, einen Schnitt eines Arrays zurückzugeben, indem eine Reihe von Elementen indexiert wird, wie folgt: a[start:stop:step]. Doch nur mit der komplexen Array-Implementierung von NumPy wird Slicing zu einer wirklich mächtigen Datenmanipulationstechnik, ohne die maschinelles Lernen oder Data Science undenkbar wären. Glücklicherweise bringt NumSharp für diejenigen, die nicht auf Python für maschinelles Lernen umsteigen können oder nicht wollen (was ich ebenfalls entwickelt habe), diese Möglichkeit in die .NET-Welt. Als einer der Entwickler bei NumSharp habe ich Ihnen einige wichtige Anwendungsfälle für Slicing mit Beispielcode-Schnipsel in C# vorgestellt. Beachten Sie, dass das Indexieren in C# nicht auf die gleiche Weise wie in Python durchgeführt werden kann, aufgrund von Unterschieden in der Sprachsyntax. Wir entschieden uns jedoch, die Python-Syntax für Slice-Definitionen beizubehalten, also haben wir Strings verwendet, um Slices in C# zu indexieren. Schau dir dieses Beispiel an, um zu sehen, wie nah NumSharp an NumPy liegt.
Schneide die Spalte aus der Matrix in Python/NumPy ausWenn er in C# mit NumSharp geschrieben wird, ist der Code nahezu identisch. Beachten Sie, dass Schnitte leicht unterschiedlich indiziert werden, wobei Strings als Parameter für den Indexer verwendet werden.
Spalten aus einer Matrix in C#/NumSharp ausschneidenWie du siehst, hat das NumSharp-Team viel Mühe darauf verwendet, den Code so ähnlich wie möglich an Python zu machen. Das ist sehr wichtig, denn so kann bestehender Python-Code, der auf NumPy basiert, nun einfach auf C# portiert werden.
Anwendungsfall: Verwenden Sie mehrere Ansichten derselben Daten
Die Möglichkeit, nur lokale Teile der zugrundeliegenden Daten (also kleine Teile großer Bilder) ohne Kopieren in Funktionen ein- und auszuleiten, ist für die Laufzeitleistung besonders bei großen Datensätzen entscheidend. Slices werden mit lokalen Koordinaten indexiert, sodass Ihr Algorithmus die globale Struktur Ihrer Daten nicht kennen muss, was Ihr Leben effektiv vereinfacht und maximale Leistung gewährleistet, da unnötige Duplikationen vermieden werden.
Anwendungsfälle: Sparse Views und rekursives Slicing
Eine sparsame Ansicht eines Arrays kann erzeugt werden, indem Schritte jenseits des Anfang und Endes des Schnittbereichs angegeben werden. Soweit ich weiß, kann das nicht einmal C# 8.0 mit der neuen Array-Slice-Syntax. Diese Funktion wird beim Umgang mit ineinandergelagerten Daten sehr wichtig. Du kannst deinen Algorithmus so entwerfen, dass er kontinuierliche Daten verarbeitet und ihm sparsame Slices bereitstellen, die kontinuierliche Datenquellen nachahmen und so die Komplexität deines Algorithmus minimieren.
Slicing kann weiter geschnitten werden, was ein sehr wichtiges Merkmal ist, wenn man mit hochdimensionalen Daten arbeitet. Das hilft auch, die Komplexität des Algorithmus zu verringern, da man die Dimensionalität der Daten durch rekursives Slicing reduzieren kann.
Anwendungsfall: Effiziente Verarbeitung hochdimensionaler Daten
Wenn du ein Datenarray als Volumen betrachten und mit seinen Teilen arbeiten musst, ohne unglaubliche Koordinatentransformationsberechnungen durchführen zu müssen, dann ist .reshape() dein Freund. Alle durch oder durch Slicing-Operationen erstellten Arrays sind .reshape(), nur eine Ansicht der Originaldaten. Wenn Sie Elemente iterieren, lesen oder in eine Ansicht schreiben, greifen Sie auf das Rohdatenarray zu. NumSharp führt die entsprechenden Indextransformationen transparent für Sie durch, sodass Sie Schnitte mit relativen Koordinaten indexieren können.
Anwendungsfall: Kehren Sie die Reihenfolge der Elemente ohne zusätzliche Kosten um
Schnitte mit negativen Schritten kehren tatsächlich die Reihenfolge der Schnitte um. Der Vorteil ist, dass sie dafür keine Daten kopieren oder aufzählen muss, genau wie IEnumerable.Reverse(). Der Unterschied besteht darin, dass die Ansicht (das Ergebnis der Operation a["::-1"]) die Daten in umgekehrter Reihenfolge anzeigt, und man kann diese invertierte Sequenz indexieren, ohne sie aufzuzählen.
Anwendungsfall: Reduziere die Komplexität durch Reduzierung der Dimensionen
Bei der Arbeit mit hochdimensionalen Daten können die Algorithmen für diese Daten ebenfalls sehr komplex werden. Im Gebrauch kann jedes hochdimensionale Volumen ausgegeben werden. Als ToString()s NumSharp-Methode NDArray verwendet wurde, ist mir aufgefallen, wie einfach und schön der Algorithmus geworden ist, indem er ND-Volumina systematisch und rekursiv in (N-1)D-Bände usw. aufteilt. Dieser Divide-and-Conquer-Ansatz liefert niedrigdimensionale Untervolumen, indem die Bereichssymbole mit den Indexsymbolen von NumSharp geschnitten werden. Bereichssymbol vs. IndexsymbolDas Reichweitensymbol ["start:stop:step"] ermöglicht es dir, auf einen Teilbereich eines gegebenen Volumens mit derselben Dimension zuzugreifen. Selbst wenn du also nur eine Spalte der 2D-Matrix ausschneidest, bekommst du immer noch eine 2D-Matrix mit nur einer Spalte. Hier ist ein kurzer C#-Code, der dies demonstriert:
Schneiden Sie die Spalte mit dem Bereichssymbol
Das Indexsymbol gibt einen (N-1) dimensionalen Schnitt an der angegebenen Stelle des n-dimensionalen Elternvolumens an. Wenn man also eine Spalte aus einer 2D-Matrix mit Indexsymbolen ausschneidet, erhält man einen 1D-Vektor:
Spaltspalten mit Indexsymbolen aufschneiden
Falls Sie den Unterschied auf den ersten Blick nicht gesehen haben, hier sind die beiden oben genannten Definitionen nebeneinander, ange[":,2:3"] vs index[":,2"], die einen großen Einfluss auf die Ergebnisse haben. Eine vollständige Referenz zum neuen Slice-Symbol findet sich im NumSharp-Wiki.
Hinweis: <T>ArraySlice
Bei der Implementierung von Slicing von n-dimensionalen Ansichten kam ich zu dem Schluss, dass es für viele andere Bereiche in .NET interessant sein könnte, also habe ich es in meine eigene eigenständige Bibliothek namens SliceAndDice aufgeteilt. Es verfügt über einen leichtgewichtigen Wrapper zur Indexierung jeder C#-Datenstruktur (wie ArraySlice<T>) und ermöglicht es, dieselben Remodeling-, Slicing- und Viewing-Mechanismen zu verwenden, ohne all die anderen umfangreichen numerischen Berechnungen. Es braucht nur ein paar hundert Codezeilen, um exzellente Slicing-Fähigkeiten zu erreichen! T[]IList<T>
Bildumlauf
NumSharp hat kürzlich denselben Slicing- und Viewing-Mechanismus erhalten, was NumPy zweifellos zu einer der wichtigsten Bibliotheken im Python-Maschinellen Lernsystem macht. SciSharp STACK ist eine Open-Source-Organisation mit einer kleinen Anzahl qualifizierter Entwickler, die sehr hart daran gearbeitet haben, dieselbe Funktionalität in die .NET-Welt zu bringen. Die neuesten Verbesserungen von NumSharp sind ein wichtiger Eckpfeiler dafür. Original:Der Hyperlink-Login ist sichtbar.
|