|
Díky skvělým novým schopnostem NumSharp pro slicing polí je .NET komunita o krok blíže k tomu, aby měla silnou open-source platformu pro strojové učení. Python je jazyk strojového učení i proto, že má skvělé knihovny jako NumPy a TensorFlow. Nicméně vývojáři v C# mají také velkou potřebu výkonných open-source knihoven pro strojové učení a datovou vědu. NumSharp, port NumPy C# organizace SciSharp STACK, nedávno udělal velký krok vpřed tím, že plně implementoval možnosti řezání, což umožňuje vytvářet libovolné podmnožiny N-dimenzionálních polí jako efektivní pohledy na surová data. To z něj činí užitečný nástroj pro použití C# pro strojové učení ve spojení s TensorFlow.NET.
Co je na tom tak zvláštního?
Pokud jste NumPy nepoužili, pravděpodobně nevíte, jak skvělé je slicing. Python pole umožňují vrátit řez pole indexováním řady prvků, následovně: a[start:stop:step]. Ale teprve s komplexní implementací pole v NumPy se slicing stává skutečně silnou technikou manipulace s daty, bez které by strojové učení nebo datová věda byly nepředstavitelné. Naštěstí pro ty, kteří nemohou nebo nechtějí přejít na Python pro strojové učení (což jsem také vytvořil), NumSharp přináší tuto možnost do .NET světa. Jako jeden z vývojářů v NumSharp jsem vám představil několik důležitých případů použití slicingu pomocí ukázkových útržků kódu v C#. Všimněte si, že indexování nelze v C# provádět stejným způsobem jako v Pythonu kvůli rozdílům v jazykové syntaxi. Rozhodli jsme se však ponechat syntaxi Pythonu pro definice řezů, takže jsme použili řetězce pro indexování řezů v C#. Podívej se na tento příklad, jak blízko je NumSharp k NumPy.
Vyřízněte sloupec z matice v Pythonu/NumPyKdyž je kód napsán v C# pomocí NumSharp, je téměř identický. Všimněte si, že řezy jsou indexovány mírně odlišně pomocí řetězců jako parametrů pro indexer.
Vyřízněte sloupce z matice v C#/NumSharpJak vidíte, tým NumSharp věnoval hodně úsilí tomu, aby byl kód co nejpodobnější Pythonu. To je velmi důležité, protože tímto způsobem lze existující Python kód založený na NumPy snadno přenést do C#.
Případ použití: Použijte více zobrazení stejných dat
Možnost předávat pouze lokální části základních dat (tj. malé části velkých obrázků) do funkcí bez kopírování je klíčová pro výkon v běhu, zejména u velkých datových sad. Řezy jsou indexovány pomocí lokálních souřadnic, takže váš algoritmus nemusí znát globální strukturu dat, což vám efektivně zjednodušuje život a zajišťuje maximální výkon, protože se předchází zbytečnému duplikování.
Případy použití: Řídké pohledy a rekurzivní řezání
Řídký pohled na pole lze vytvořit specifikací kroků za začátkem a koncem rozsahu řezu. Pokud vím, ani C# 8.0 s novou syntaxí array slice to neumí. Tato funkce je velmi důležitá při práci s prokládanými daty. Můžete navrhnout svůj algoritmus tak, aby zpracovával spojitá data a poskytoval mu řídké řezy, které napodobují spojité datové zdroje, čímž minimalizujete složitost algoritmu.
Řezání lze dále rozdělit, což je velmi důležitá vlastnost, pokud pracujete s vysokorozměrnými daty. To také pomáhá snížit složitost algoritmu, protože můžete snížit dimenzionalitu dat rekurzivním řezem.
Případ použití: Efektivní zpracování vysoce dimenzionálních dat
Pokud potřebujete vnímat pole dat jako objem a pracovat s jeho částmi bez nutnosti dělat neuvěřitelné výpočty transformace souřadnic, pak je .reshape() váš přítel. Všechna pole vytvořená nebo slicing operacemi jsou .reshape(), pouze zobrazení původních dat. Když iterujete, čtete nebo zapisujete prvky do pohledu, přistupujete k surovému datovému poli. NumSharp transparentně provede příslušné indexové transformace za vás, takže můžete indexovat řezy s relativními souřadnicemi.
Případ použití: Obrátit pořadí prvků bez dalších nákladů
Řezy používající záporné kroky ve skutečnosti obracejí pořadí řezů. Výhodou je, že k tomu nemusí kopírovat ani enumerovat data, stejně jako IEnumerable.Reverse(). Rozdíl je v tom, že pohled (výsledek operace a["::-1"]) zobrazuje data v opačném pořadí a můžete indexovat do této inverzní posloupnosti bez jejího vyjmenování.
Případ použití: Snížit složitost zmenšením rozměrů
Při práci s vysokorozměrnými daty mohou být algoritmy pro tato data také velmi složité. Při použití lze výstupem vytvořit jakýkoli vysokorozměrný objem. Když metoda ToString() NumSharp NDArray vytvořila, všiml jsem si, jak jednoduchý a krásný se algoritmus stal systematickým a rekurzivním rozřezáváním ND svazků na (N-1)D objemy atd. Tento přístup rozděl a panuj vrací nízkorozměrné subobjemy tím, že se symboly rozsahu rozdělí pomocí indexových symbolů NumSharpu. Symbol rozsahu vs. symbol indexuSymbol rozsahu ["start:stop:step"] vám umožňuje přistupovat k podrozsahu daného objemu se stejnou dimenzí. Takže i když vyříznete pouze jeden sloupec 2D matice, stále dostanete 2D matici s pouze jedním sloupcem. Tady je krátký kousek kódu v C#, který to demonstruje:
Rozřízněte sloupec pomocí symbolu rozsahu
Indexový symbol vám dává (N-1) rozměrný řez na určeném místě N-rozměrného rodičovského objemu. Takže vyříznutím sloupce z 2D matice pomocí indexových symbolů dostanete 1D vektor:
Sloupce s řezy pomocí indexových symbolů
Pokud jste rozdíl neviděli na první pohled, zde jsou dvě výše uvedené definice řezů vedle sebe, ange[":,2:3"] vs index[":,2"], které mají velký vliv na výsledky. Úplný odkaz na nový symbol řezu lze najít na wiki NumSharp.
Poznámka: <T>ArraySlice
Při implementaci slicingu N-dimenzionálních pohledů jsem dospěl k závěru, že by to mohlo být zajímavé i pro mnoho dalších oblastí .NET, a tak jsem to rozdělil do vlastní samostatné knihovny nazvané SliceAndDice. Funguje jako lehký obal pro indexaci jakékoli C# datové struktury (například or) ArraySlice <T>a umožňuje používat stejné mechanismy přemodelování, řezání a prohlížení bez nutnosti složitých číselných výpočtů. Stačí jen pár stovek řádků kódu a dosáhlo se skvělých schopností řezání! T[]IList<T>
ovinovací
NumSharp nedávno dostal stejný mechanismus pro řezání a prohlížení, což nepochybně činí z NumPy jednu z nejdůležitějších knihoven v ekosystému strojového učení Pythonu. SciSharp STACK je open source organizace malého počtu zkušených vývojářů, kteří tvrdě pracovali na tom, aby stejnou funkcionalitu přinesli i do .NET světa. Nejnovější vylepšení NumSharp jsou důležitým pilířem tohoto cíle. Původní:Přihlášení k hypertextovému odkazu je viditelné.
|