|
Takket være NumSharps fantastiske nye array slicing-muligheder er .NET-fællesskabet et skridt nærmere at have en kraftfuld open source maskinlæringsplatform. Python er et maskinlæringssprog delvist fordi det har gode biblioteker som NumPy og TensorFlow. Dog har C#-udviklere også et stort behov for kraftfulde open source-biblioteker til maskinlæring og data science. NumSharp, NumPy C#-porten fra SciSharp STACK-organisationen, har for nylig taget et stort skridt fremad ved fuldt ud at implementere slicing-muligheder, hvilket muliggør oprettelse af vilkårlige delmængder af N-dimensionelle arrays som effektive visninger af rå data. Det gør det til et nyttigt værktøj til at bruge C# til maskinlæring sammen med TensorFlow.NET.
Hvad er det store problem?
Hvis du ikke har brugt NumPy, ved du sandsynligvis ikke, hvor god slicing er. Python-arrays tillader at returnere et snit af et array ved at indeksere en række elementer, som følger: a[start:stop:step]. Men kun med NumPys komplekse array-implementering bliver slicing en virkelig kraftfuld datamanipulationsteknik, uden hvilken maskinlæring eller datavidenskab ville være utænkelig. Heldigvis, for dem der ikke kan eller ikke ønsker at skifte til Python for maskinlæring (som jeg også har lavet), bringer NumSharp denne funktion til .NET-verdenen. Som en af udviklerne hos NumSharp har jeg introduceret dig til nogle vigtige slicing-anvendelsestilfælde med eksempelkodeuddrag i C#. Bemærk, at indeksering ikke kan udføres i C# på samme måde som i Python på grund af forskelle i sprogets syntaks. Vi besluttede dog at beholde Python-syntaksen til slice-definitioner, så vi brugte strenge til at indeksere slices i C#. Se dette eksempel for at se, hvor tæt NumSharp er på NumPy.
Klip kolonnen ud af matricen i Python/NumPyNår den skrives i C# med NumSharp, er koden næsten identisk. Bemærk, at skiver indekseres lidt anderledes ved at bruge strenge som parametre for indekseren.
Udklip kolonner fra en matrix i C#/NumSharpSom du kan se, har NumSharp-teamet lagt meget arbejde i at gøre koden så lig Python som muligt. Dette er meget vigtigt, fordi eksisterende Python-kode, der er afhængig af NumPy, på denne måde nu nemt kan porteres til C#.
Brugstilfælde: Brug flere visninger af de samme data
At kunne sende kun lokale dele af de underliggende data (dvs. små stykker store billeder) ind og ud af funktioner uden kopiering er afgørende for kørselshastighed, især for store datasæt. Snit indekseres ved hjælp af lokale koordinater, så din algoritme behøver ikke kende den globale struktur af dine data, hvilket effektivt forenkler dit liv og sikrer maksimal ydeevne, fordi unødvendig duplikering undgås.
Brugstilfælde: Sparsomme visninger og rekursiv slicing
Et sparsomt overblik over et array kan skabes ved at specificere trin ud over begyndelsen og slutningen af snitområdet. Så vidt jeg ved, kan selv C# 8.0 med den nye array slice-syntaks ikke gøre dette. Denne funktion bliver meget vigtig, når man arbejder med sammenflettede data. Du kan designe din algoritme til at håndtere kontinuerlige data og give den sparsomme snit, der efterligner kontinuerlige datakilder, hvilket minimerer kompleksiteten af din algoritme.
Slicing kan skæres yderligere, hvilket er en meget vigtig funktion, hvis du arbejder med højdimensionelle data. Dette hjælper også med at reducere algoritmens kompleksitet, da du kan reducere dataenes dimensionalitet ved rekursivt at skære.
Brugstilfælde: Effektiv behandling af højdimensionelle data
Hvis du skal tænke på et array af data som et volumen og arbejde med dets dele uden at skulle lave utrolige koordinattransformationsberegninger, så er .reshape() din ven. Alle arrays oprettet ved eller slicing-operationer er .reshape(), blot en visning af de oprindelige data. Når du iterererer, læser eller skriver elementer til en visning, får du adgang til det rå dataarray. NumSharp udfører transparent de relevante indekstransformationer for dig, så du kan indeksere skiver med relative koordinater.
Brugstilfælde: Vend elementernes rækkefølge om uden ekstra omkostninger
Snit, der bruger negative skridt, vender faktisk rækkefølgen af skiverne om. Fordelen ved det er, at det ikke behøver at kopiere eller opregne data for at gøre dette, ligesom IEnumerable.Reverse(). Forskellen er, at visningen (resultatet af operationen a["::-1"]) viser dataene i omvendt rækkefølge, og du kan indeksere til den inverterede sekvens uden at opregne den.
Brugstilfælde: Reducer kompleksiteten ved at reducere dimensioner
Når man arbejder med højdimensionelle data, kan algoritmerne for disse data også blive meget komplekse. I brug kan ethvert højdimensionelt volumen outputtes. Da jeg benyttede ToString()'s NumSharp-metode NDArray, bemærkede jeg, hvor simpel og smuk algoritmen er blevet ved systematisk og rekursivt at skære ND-volumer i (N-1)D-volumer osv. Denne del-og-hersk-tilgang returnerer lavdimensionelle delvolumer ved at skære intervalsymbolerne med NumSharps indekssymboler. Intervalsymbol vs. indekssymbolRækkeviddesymbolet ["start:stop:trin"] giver dig adgang til et delområde af et givent volumen med samme dimension. Så selv hvis du kun skærer én kolonne ud af 2D-matricen, får du stadig en 2D-matrix med kun én kolonne. Her er et kort stykke C#-kode, der demonstrerer dette:
Skær kolonnen ved hjælp af intervalsymbolet
Indekssymbolet giver dig et (N-1) dimensionelt snit på det angivne sted for det N-dimensionale forældrevolumen. Så ved at skære en kolonne ud af en 2D-matrix ved hjælp af indekssymboler får du en 1D-vektor:
Slice kolonner ved brug af indekssymboler
Hvis du ikke har set forskellen med det samme, er her de to slice-definitioner ovenfor side om side, ange vs index[":,2"], som har stor betydning for resultaterne. En fuld reference til det nye snitsymbol kan findes på NumSharp-wikien.
Bemærk: <T>ArraySlice
Ved implementeringen af slicing af N-dimensionelle visninger konkluderede jeg, at det kunne være interessant for mange andre områder i .NET, så jeg opdelte det i mit eget selvstændige bibliotek kaldet SliceAndDice. Den fungerer som en letvægts wrapper til indeksering af enhver C#-datastruktur (såsom ArraySlice<T>) og tillader dig at bruge de samme omstrukturerings-, slicing- og visningsmekanismer uden alle de andre tunge numeriske beregninger. Det kræver kun et par hundrede linjer kode at opnå fremragende slicing-evner! T[]IList<T>
Wraparound
NumSharp har for nylig fået samme slicing- og visningsmekanisme, hvilket uden tvivl gør NumPy til et af de vigtigste biblioteker i Pythons maskinlæringsøkosystem. SciSharp STACK er en open source-organisation bestående af et lille antal dygtige udviklere, som har arbejdet meget hårdt for at bringe den samme funktionalitet til .NET-verdenen. NumSharps seneste forbedringer er en vigtig hjørnesten i at opnå dette. Oprindelig:Hyperlink-login er synlig.
|