|
Grâce aux excellentes nouvelles capacités de découpage de tableaux de NumSharp, la communauté .NET est un pas plus rapprochée d’une plateforme puissante d’apprentissage automatique open source. Python est un langage d’apprentissage automatique en partie parce qu’il possède d’excellentes bibliothèques comme NumPy et TensorFlow. Cependant, les développeurs C# ont aussi un grand besoin de bibliothèques open source puissantes pour l’apprentissage automatique et la data science. NumSharp, le portage NumPy C# de l’organisation SciSharp STACK, a récemment franchi un grand pas en avant en implémentant pleinement des capacités de découpage, permettant la création de sous-ensembles arbitraires de tableaux N-dimensionnels comme vues efficaces des données brutes. Cela en fait un outil utile pour utiliser C# en apprentissage automatique en conjonction avec TensorFlow.NET.
Quel est le problème ?
Si vous n’avez pas utilisé NumPy, vous ne savez probablement pas à quel point le slicing est génial. Les tableaux Python permettent de retourner une tranche d’un tableau en indexant une série d’éléments, comme suit : a[start :stop :step]. Mais ce n’est qu’avec l’implémentation complexe de NumPy que le découpage devient une technique de manipulation de données vraiment puissante, sans laquelle l’apprentissage automatique ou la data science seraient inimaginables. Heureusement, pour ceux qui ne peuvent pas ou ne veulent pas passer à Python pour l’apprentissage automatique (que j’ai aussi fait), NumSharp apporte cette fonctionnalité dans le monde .NET. En tant que développeur chez NumSharp, je vous ai présenté quelques cas d’utilisation importants du découpage avec des extraits de code exemples en C#. Notez que l’indexation ne peut pas être effectuée en C# de la même manière qu’en Python en raison des différences de syntaxe du langage. Cependant, nous avons décidé de conserver la syntaxe Python pour les définitions de tranches, alors nous avons utilisé des chaînes pour indexer les tranches en C#. Regarde cet exemple pour voir à quel point NumSharp est proche de NumPy.
Découpez la colonne de la matrice en Python/NumPyLorsqu’il est écrit en C# avec NumSharp, le code est presque identique. Notez que les tranches sont indexées légèrement différemment en utilisant des chaînes comme paramètres pour l’indexeur.
Découpez des colonnes d’une matrice en C#/NumSharpComme vous pouvez le voir, l’équipe NumSharp a mis beaucoup d’efforts pour rendre le code aussi similaire que possible à Python. C’est très important car de cette façon, le code Python existant qui dépend de NumPy peut désormais être facilement porté en C#.
Cas d’utilisation : Utiliser plusieurs vues des mêmes données
Pouvoir ne faire passer que des parties locales des données sous-jacentes (c’est-à-dire de petits morceaux de grandes images) dans et hors des fonctions sans copier est essentiel pour les performances à l’exécution, en particulier pour les grands ensembles de données. Les tranches sont indexées à l’aide de coordonnées locales, donc votre algorithme n’a pas besoin de connaître la structure globale de vos données, ce qui simplifie ainsi votre vie et garantit des performances maximales car la duplication inutile est évitée.
Cas d’utilisation : vues clairsemées et découpage récursif
Une vue clairsemée d’un tableau peut être créée en spécifiant les étapes au-delà du début et de la fin de la plage de tranches. À ma connaissance, même C# 8.0 avec la nouvelle syntaxe de la tranche de tableau ne peut pas faire cela. Cette fonctionnalité devient très importante lorsqu’on traite des données entrelacées. Vous pouvez concevoir votre algorithme pour gérer des données continues et lui fournir des tranches clairsemées qui imitent des sources de données continues, minimisant ainsi la complexité de votre algorithme.
Le tranchant peut être découpé davantage, ce qui est une fonctionnalité très importante si vous travaillez avec des données de haute dimension. Cela aide aussi à réduire la complexité de l’algorithme, car vous pouvez diminuer la dimensionnalité des données en découpant récursivement.
Cas d’utilisation : Traiter efficacement des données de haute dimension
Si vous devez considérer un tableau de données comme un volume et travailler avec ses parties sans avoir à faire d’incroyables calculs de transformation de coordonnées, alors .reshape() est votre allié. Tous les tableaux créés par ou par des opérations de découpage sont .reshape() simplement une vue des données originales. Lorsque vous itérerez, lisez ou écrivez des éléments dans une vue, vous accédez au tableau de données brut. NumSharp effectue de manière transparente les transformations d’index appropriées pour vous, vous permettant ainsi d’indexer des tranches avec des coordonnées relatives.
Cas d’utilisation : inverser l’ordre des éléments sans coût supplémentaire
Les tranches utilisant des pas négatifs inversent en réalité l’ordre des tranches. L’avantage est qu’il n’a pas besoin de copier ou d’énumérer des données pour cela, tout comme IEnumerable.Reverse(). La différence est que la vue (le résultat de l’opération a[ » ::-1"]) affiche les données dans l’ordre inverse, et vous pouvez indexer cette séquence inversée sans l’énumérer.
Cas d’usage : Réduire la complexité en réduisant les dimensions
Lorsqu’on travaille avec des données de haute dimension, les algorithmes pour ces données peuvent également devenir très complexes. En usage, tout volume de haute dimension peut être sorti. Avec la méthode NumSharp de ToString() NDArray, j’ai remarqué à quel point l’algorithme est devenu simple et beau en découpant systématiquement et récursivement les volumes ND en volumes (N-1)D, etc. Cette approche divise-va-re retourne les sous-volumes de faible dimension en tranchant les symboles de plage à l’aide des symboles d’index de NumSharp. Symbole de plage vs. symbole d’indexLe symbole de plage [« start :stop :step »] permet d’accéder à une sous-plage d’un volume donné ayant la même dimension. Donc, même si vous ne coupez qu’une seule colonne de la matrice 2D, vous obtiendrez quand même une matrice 2D avec une seule colonne. Voici un court morceau de code C# qui le démontre :
Découpez la colonne en utilisant le symbole de plage
Le symbole d’index vous donne une tranche de dimension (N-1) à l’emplacement spécifié du volume parent de dimension N. Ainsi, découper une colonne d’une matrice 2D à l’aide de symboles d’index vous donne un vecteur 1D :
Colonnes de tranche utilisant des symboles d’index
Si vous n’avez pas vu la différence d’un coup d’œil, voici les deux définitions de tranches ci-dessus, ange[ » :,2:3"] vs index[ » :,2"], qui ont un impact important sur les résultats. Une référence complète au nouveau symbole de tranche se trouve sur le wiki de NumSharp.
Note : <T>ArraySlice
En implémentant le découpage des vues N-dimensionnelles, j’en ai conclu que cela pourrait être intéressant pour de nombreux autres domaines de .NET, alors je l’ai décomposé en ma propre bibliothèque autonome appelée SliceAndDice. Il est un wrapper léger pour indexer toute structure de données C# (comme ou) <T>ArraySlice, et permet d’utiliser les mêmes mécanismes de remodelage, de tranche et de visualisation sans tous les autres calculs numériques lourds. Il ne faut que quelques centaines de lignes de code pour obtenir d’excellentes capacités de découpage ! T[]IList<T>
Enveloppant
NumSharp a récemment reçu le même mécanisme de découpage et de visionnage, ce qui fait sans aucun doute de NumPy l’une des bibliothèques les plus importantes de l’écosystème de l’apprentissage automatique Python. SciSharp STACK est une organisation open source regroupant un petit nombre de développeurs qualifiés qui ont travaillé très dur pour apporter la même fonctionnalité dans le monde .NET. Les dernières améliorations de NumSharp sont une pierre angulaire importante pour y parvenir. Langue source:La connexion hyperlientérée est visible.
|