|
Vďaka skvelým novým schopnostiam NumSharp v oblasti slicingu polí je .NET komunita o krok bližšie k tomu, aby mala silnú open-source platformu strojového učenia. Python je jazyk strojového učenia aj preto, že má skvelé knižnice ako NumPy a TensorFlow. Vývojári v C# však tiež veľmi potrebujú výkonné open-source knižnice pre strojové učenie a dátovú vedu. NumSharp, NumPy C# port organizácie SciSharp STACK, nedávno urobil veľký krok vpred tým, že plne implementoval možnosti rezania, čo umožňuje vytvárať ľubovoľné podmnožiny N-rozmerných polí ako efektívne zobrazenie surových dát. To z neho robí užitočný nástroj na použitie C# pre strojové učenie v kombinácii s TensorFlow.NET.
Čo je na tom také veľké?
Ak ste NumPy nepoužívali, pravdepodobne neviete, aké skvelé je rezanie. Python polia umožňujú vrátiť časť poľa indexovaním série prvkov, nasledovne: a[start:stop:step]. Až s komplexnou implementáciou polí v NumPy sa však slicing stáva skutočne silnou technikou manipulácie s dátami, bez ktorej by strojové učenie alebo dátová veda boli nepredstaviteľné. Našťastie, pre tých, ktorí nemôžu alebo nechcú prejsť na Python pre strojové učenie (čo som vytvoril aj ja), NumSharp prináša túto možnosť do .NET sveta. Ako jeden z vývojárov v NumSharp som vám predstavil niekoľko dôležitých prípadov použitia slicingu pomocou ukážkových úryvkov kódu v C#. Treba poznamenať, že indexovanie v C# nie je možné vykonávať rovnakým spôsobom ako v Pythone kvôli rozdielom v syntaxi jazyka. Rozhodli sme sa však ponechať syntax Pythonu pre definície rezkov, takže sme použili reťazce na indexovanie rezkov v C#. Pozrite si tento príklad, aby ste videli, ako blízko je NumSharp k NumPy.
Vystrihnite stĺpec z matice v Pythone/NumPyKeď je kód napísaný v C# pomocou NumSharp, je takmer identický. Všimnite si, že rezy sú indexované mierne odlišne pri používaní reťazcov ako parametrov pre indexer.
Vystrihnite stĺpce z matice v C#/NumSharpAko vidíte, tím NumSharp vynaložil veľa úsilia na to, aby bol kód čo najviac podobný Pythonu. To je veľmi dôležité, pretože týmto spôsobom je možné existujúci Python kód, ktorý sa spolieha na NumPy, ľahko portovať do C#.
Prípad použitia: Použitie viacerých pohľadov na tie isté dáta
Schopnosť prenášať iba lokálne časti základných dát (t. j. malé časti veľkých obrázkov) do a z funkcií bez kopírovania je kľúčová pre výkon v behu, najmä pri veľkých dátových súboroch. Rezy sú indexované pomocou lokálnych súradníc, takže váš algoritmus nemusí poznať globálnu štruktúru dát, čo vám efektívne zjednodušuje život a zabezpečuje maximálny výkon, pretože sa predchádza zbytočnému duplikátu.
Prípady použitia: Riedke pohľady a rekurzívne rezanie
Riedky pohľad na pole možno vytvoriť špecifikovaním krokov za začiatkom a koncom rozsahu rezu. Pokiaľ viem, ani C# 8.0 s novou syntaxou array slice to nedokáže. Táto vlastnosť je veľmi dôležitá pri práci s prekladanými dátami. Môžete navrhnúť svoj algoritmus tak, aby spracovával kontinuálne dáta a poskytoval mu riedke rezy, ktoré napodobňujú kontinuálne zdroje dát, čím minimalizujete zložitosť algoritmu.
Rezanie sa dá ďalej rozrezať, čo je veľmi dôležitá vlastnosť, ak pracujete s vysokorozmernými dátami. To tiež pomáha znížiť zložitosť algoritmu, pretože môžete znížiť dimenzionalitu dát rekurzívnym rezaním.
Prípad použitia: Efektívne spracovanie vysokorozmerných dát
Ak potrebujete myslieť na pole dát ako na objem a pracovať s jeho časťami bez toho, aby ste museli robiť neuveriteľné výpočty transformácie súradníc, potom .reshape() je váš priateľ. Všetky polia vytvorené alebo slicing operáciami sú .reshape(), len pohľad na pôvodné dáta. Keď iterujete, čítate alebo zapisujete prvky do zobrazenia, pristupujete k surovému dátovému poľu. NumSharp transparentne vykonáva príslušné indexové transformácie za vás, takže môžete indexovať rezy s relatívnymi súradnicami.
Prípad použitia: Obrátiť poradie prvkov bez ďalších nákladov
Rezy používajúce záporné kroky v skutočnosti obracia poradie rezov. Výhodou je, že na to nemusí kopírovať ani enumerovať dáta, podobne ako IEnumerable.Reverse(). Rozdiel je v tom, že pohľad (výsledok operácie a["::-1"]) zobrazuje údaje v opačnom poradí a môžete indexovať na túto invertovanú sekvenciu bez jej vymenovania.
Prípad použitia: Znížiť zložitosť zmenšením rozmerov
Pri práci s vysokorozmernými dátami môžu byť algoritmy pre tieto dáta tiež veľmi zložité. Pri používaní môže byť výstupom akýkoľvek vysokorozmerný objem. Keď ToString() použil NDArray metódu NumSharp, všimol som si, aký jednoduchý a krásny sa algoritmus stal systematickým a rekurzívnym rozdelením ND zväzkov na (N-1)D objemy a podobne. Tento prístup "rozdel-and-panuj" vracia nízkorozmerné podobjemy tým, že rozdeľuje symboly rozsahu pomocou indexových symbolov NumSharpu. Symbol rozsahu vs. symbol indexuSymbol rozsahu ["start:stop:step"] vám umožňuje pristupovať k podrozsahu daného objemu s rovnakým rozmerom. Takže aj keď vyrežete len jeden stĺpec 2D matice, stále dostanete 2D maticu s iba jedným stĺpcom. Tu je krátky kúsok C# kódu, ktorý to demonštruje:
Rozrežte stĺpec pomocou symbolu rozsahu
Indexový symbol vám dáva (N-1) dimenzionálny výsek na určenom mieste N-rozmerného rodičovského objemu. Takže vyrezaním stĺpca z 2D matice pomocou indexových symbolov dostanete 1D vektor:
Slice stĺpce pomocou indexových symbolov
Ak ste rozdiel nevideli na prvý pohľad, tu sú dve vyššie uvedené definície rezov vedľa seba, ange[":,2"] vs index[":,2"], ktoré majú veľký vplyv na výsledky. Úplný odkaz na nový symbol rezu nájdete na wiki NumSharp.
Poznámka: <T>ArraySlice
Pri implementácii rezania N-rozmerných pohľadov som dospel k záveru, že by to mohlo byť zaujímavé aj pre mnohé iné oblasti .NET, a tak som to rozdelil do vlastnej samostatnej knižnice s názvom SliceAndDice. Funguje ako ľahký obal na indexovanie akejkoľvek C# dátovej štruktúry (napríklad or) ArraySlice <T>a umožňuje používať rovnaké mechanizmy premodelovania, rezania a zobrazovania bez všetkých ostatných náročných číselných výpočtov. Na dosiahnutie vynikajúcich schopností rezania stačí len niekoľko stoviek riadkov kódu! T[]IList<T>
Wraparound
NumSharp nedávno dostal rovnaký mechanizmus rezania a prezerania, čo nepochybne robí z NumPy jednu z najdôležitejších knižníc v ekosystéme strojového učenia Pythonu. SciSharp STACK je open source organizácia malého počtu skúsených vývojárov, ktorí tvrdo pracovali na tom, aby rovnakú funkcionalitu priniesli do sveta .NET. Najnovšie vylepšenia NumSharp sú dôležitým základom pri dosahovaní tohto cieľa. Originál:Prihlásenie na hypertextový odkaz je viditeľné.
|