Sdílet prostřednictvím


Průvodce jazykem specifikace neurální sítě Net# pro Machine Learning Studio (classic)

PLATÍ PRO: Platí pro. Machine Learning Studio (Classic) Nevztahuje se na.Azure Machine Learning

Důležité

Podpora studia Machine Learning (Classic) skončí 31. srpna 2024. Doporučujeme do tohoto data přejít na službu Azure Machine Learning.

Od 1. prosince 2021 nebude možné vytvářet nové prostředky studia Machine Learning (Classic). Do 31. srpna 2024 můžete pokračovat v používání stávajících prostředků studia Machine Learning (Classic).

Dokumentace ke studiu ML (Classic) se vyřazuje z provozu a v budoucnu se nemusí aktualizovat.

Net# je jazyk vyvinutý Microsoftem, který se používá k definování komplexních architektur neurální sítě, jako jsou hluboké neurální sítě nebo konvoluce libovolných dimenzí. Pomocí složitých struktur můžete zlepšit výuku dat, jako jsou obrázky, video nebo zvuk.

Specifikace architektury Net# můžete použít ve všech neurálních síťových modulech v nástroji Machine Learning Studio (classic):

Tento článek popisuje základní koncepty a syntaxi potřebné k vývoji vlastní neurální sítě pomocí net#:

  • Požadavky na neurální síť a definování primárních komponent
  • Syntaxe a klíčová slova jazyka specifikace Net#
  • Příklady vlastních neurálních sítí vytvořených pomocí netu#

Základy neurální sítě

Struktura neurální sítě se skládá z uzlů, které jsou uspořádány ve vrstvách, a vážená připojení (nebo hrany) mezi uzly. Připojení jsou směrová a každé připojení má zdrojový uzel a cílový uzel.

Každá vytrénovatelná vrstva (skrytá nebo výstupní vrstva) má jednu nebo více sad připojení. Sada připojení se skládá ze zdrojové vrstvy a specifikace připojení z této zdrojové vrstvy. Všechna připojení v dané sadě sdílejí zdrojovou a cílovou vrstvu. V net# se sada připojení považuje za součást cílové vrstvy sady.

Net# podporuje různé druhy sad připojení, které umožňují přizpůsobit způsob, jakým se vstupy mapují na skryté vrstvy a mapují se na výstupy.

Výchozí nebo standardní sada je úplná sada, ve které je každý uzel ve zdrojové vrstvě připojený ke každému uzlu v cílové vrstvě.

Net# navíc podporuje následující čtyři druhy pokročilých sad připojení:

  • Filtrované svazky. Predikát můžete definovat pomocí umístění uzlu zdrojové vrstvy a cílového uzlu vrstvy. Uzly jsou připojeny vždy, když je predikát True.

  • Konvoluční svazky. Ve zdrojové vrstvě můžete definovat malé čtvrti uzlů. Každý uzel v cílové vrstvě je připojený k jedné čtvrti uzlů ve zdrojové vrstvě.

  • Sdružování svazků a sad normalizace odpovědí Jsou podobné konvolučním svazkům v tom, že uživatel definuje malé čtvrti uzlů ve zdrojové vrstvě. Rozdíl je v tom, že váhy hran v těchto svazcích nejsou vytrénovatelné. Místo toho se na hodnoty zdrojového uzlu použije předdefinovaná funkce, která určuje hodnotu cílového uzlu.

Podporovaná přizpůsobení

Architekturu modelů neurálních sítí, které vytvoříte v nástroji Machine Learning Studio (classic), je možné výrazně přizpůsobit pomocí nástroje Net#. Můžete provádět následující akce:

  • Vytvořte skryté vrstvy a určete počet uzlů v každé vrstvě.
  • Určete, jak se mají vrstvy vzájemně propojit.
  • Definujte speciální struktury připojení, jako jsou konvoluce a svazky sdílení hmotnosti.
  • Zadejte různé aktivační funkce.

Podrobnosti o syntaxi jazyka specifikace naleznete v tématu Specifikace struktury.

Příklady definování neurálních sítí pro některé běžné úlohy strojového učení, od simplex po složité, najdete v tématu Příklady.

Obecné požadavky

  • Musí existovat přesně jedna výstupní vrstva, alespoň jedna vstupní vrstva a nula nebo více skrytých vrstev.
  • Každá vrstva má pevný počet uzlů, koncepčně uspořádané do obdélníkového pole libovolných dimenzí.
  • Vstupní vrstvy nemají přidružené vytrénované parametry a představují bod, ve kterém data instance zadávají síť.
  • Vytrénovatelné vrstvy (skryté a výstupní vrstvy) mají přidružené natrénované parametry, označované jako váhy a předsudky.
  • Zdrojové a cílové uzly musí být v samostatných vrstvách.
  • Připojení musí být cyklická; Jinými slovy, nemůže existovat řetěz připojení, která vedou zpět k počátečnímu zdrojovému uzlu.
  • Výstupní vrstva nemůže být zdrojovou vrstvou sady připojení.

Specifikace struktury

Specifikace struktury neurální sítě se skládá ze tří částí: konstantní deklarace, deklarace vrstvy, deklarace připojení. K dispozici je také volitelná část deklarace sdílené složky. Oddíly lze zadat v libovolném pořadí.

Deklarace konstanty

Deklarace konstanty je volitelná. Poskytuje prostředky k definování hodnot používaných jinde v definici neurální sítě. Příkaz deklarace se skládá z identifikátoru následovaného symbolem rovná se a výrazem hodnoty.

Například následující příkaz definuje konstantu x:

Const X = 28;

Pokud chcete definovat dvě nebo více konstant současně, uzavřete názvy identifikátorů a hodnoty do složených závorek a oddělte je středníky. Příklad:

Const { X = 28; Y = 4; }

Pravá strana každého výrazu přiřazení může být celé číslo, reálné číslo, logická hodnota (Pravda nebo Nepravda) nebo matematický výraz. Příklad:

Const { X = 17 * 2; Y = true; }

Deklarace vrstvy

Je vyžadována deklarace vrstvy. Definuje velikost a zdroj vrstvy, včetně jejích připojovacích sad a atributů. Příkaz deklarace začíná názvem vrstvy (vstup, skrytý nebo výstup), za kterým následuje dimenze vrstvy (řazená kolekce kladných celých čísel). Příklad:

input Data auto;
hidden Hidden[5,20] from Data all;
output Result[2] from Hidden all;
  • Součin dimenzí je počet uzlů ve vrstvě. V tomto příkladu existují dvě dimenze [5,20], což znamená, že ve vrstvě je 100 uzlů.
  • Vrstvy lze deklarovat v libovolném pořadí, s jednou výjimkou: Pokud je definována více než jedna vstupní vrstva, musí pořadí, ve kterém jsou deklarovány, odpovídat pořadí funkcí ve vstupních datech.

Pokud chcete určit, že počet uzlů ve vrstvě se určí automaticky, použijte auto klíčové slovo. Klíčové auto slovo má různé efekty v závislosti na vrstvě:

  • V deklaraci vstupní vrstvy je počet uzlů ve vstupních datech počet funkcí.
  • Ve skryté deklaraci vrstvy je počet uzlů číslo, které je určeno hodnotou parametru pro počet skrytých uzlů.
  • V deklaraci výstupní vrstvy je počet uzlů 2 pro dvoutřídní klasifikaci, 1 pro regresi a roven počtu výstupních uzlů pro klasifikaci s více třídami.

Například následující definice sítě umožňuje automaticky určit velikost všech vrstev:

input Data auto;
hidden Hidden auto from Data all;
output Result auto from Hidden all;

Deklarace vrstvy pro natrénovatelnou vrstvu (skryté nebo výstupní vrstvy ) může volitelně obsahovat výstupní funkci (označovanou také jako aktivační funkce), která pro klasifikační modely ve výchozím nastavení je sigmoid a lineární pro regresní modely. I když použijete výchozí nastavení, můžete v případě potřeby explicitně uvést funkci aktivace.

Podporují se následující výstupní funkce:

  • esovitý
  • lineární
  • softmax
  • rlinear
  • náměstí
  • Sqrt
  • srlinear
  • Abs
  • tanh
  • brlinear

Například následující deklarace používá funkci softmax :

output Result [100] softmax from Hidden all;

Deklarace připojení

Ihned po definování natrénovatelné vrstvy musíte deklarovat připojení mezi vrstvami, které jste definovali. Deklarace sady připojení začíná klíčovým slovem from, za kterým následuje název zdrojové vrstvy sady a druh sady připojení, která se má vytvořit.

V současné době se podporuje pět typů sad připojení:

  • Úplné svazky označené klíčovým slovem all
  • Filtrované svazky označené klíčovým slovem wherea následným predikátem výrazu
  • Konvoluční svazky označené klíčovým slovem convolve, následované konvolučními atributy
  • Sady fondů označené maximálním nebo středním fondem klíčových slov
  • Sady normalizace odpovědí označené normou odezvy klíčového slova

Úplné balíčky

Úplná sada připojení zahrnuje připojení z každého uzlu ve zdrojové vrstvě ke každému uzlu v cílové vrstvě. Toto je výchozí typ síťového připojení.

Filtrované svazky

Specifikace filtrované sady připojení zahrnuje predikát vyjádřený syntakticky, podobně jako výraz lambda jazyka C#. Následující příklad definuje dva filtrované sady:

input Pixels [10, 20];
hidden ByRow[10, 12] from Pixels where (s,d) => s[0] == d[0];
hidden ByCol[5, 20] from Pixels where (s,d) => abs(s[1] - d[1]) <= 1;
  • V predikátu pro ByRowje s parametr představující index do obdélníkového pole uzlů vstupní vrstvy Pixelsa d je parametr představující index do pole uzlů skryté vrstvy, ByRow. Typ obou s a d je řazená kolekce celých čísel o délce 2. Koncepčně, s rozsahy nad všemi dvojicemi celých čísel s 0 <= s[0] < 10 a 0 <= s[1] < 20, a d rozsahy ve všech dvojicích celých čísel, s 0 <= d[0] < 10 a 0 <= d[1] < 12.

  • Na pravé straně výrazu predikátu je podmínka. V tomto příkladu platí pro každou hodnotu a d takovou hodnotus, že podmínka je True, existuje okraj ze zdrojového uzlu vrstvy do cílového uzlu vrstvy. Tento výraz filtru tedy označuje, že sada obsahuje připojení z uzlu definovaného s uzlem ve d všech případech, kdy se s[0] rovná d[0].

Volitelně můžete zadat sadu váhy pro filtrovaný svazek. Hodnota atributu Weights musí být řazená kolekce hodnot s plovoucí desetinou čárkou s délkou, která odpovídá počtu připojení definovaných sadou. Ve výchozím nastavení se váhy náhodně generují.

Hodnoty váhy jsou seskupené podle indexu cílového uzlu. To znamená, že pokud je první cílový uzel připojený ke zdrojovým uzlům K, K první prvky řazené kolekce členů váhy jsou váhy prvního cílového uzlu ve zdrojovém pořadí indexu. Totéž platí pro zbývající cílové uzly.

Váhy je možné zadat přímo jako konstantní hodnoty. Pokud jste se například dříve naučili váhy, můžete je zadat jako konstanty pomocí této syntaxe:

const Weights_1 = [0.0188045055, 0.130500451, ...]

Konvoluční svazky

Pokud trénovací data mají homogenní strukturu, konvoluční připojení se běžně používají k získání základních funkcí dat. Například v obrazových, zvukových nebo video datech může být prostorová nebo dočasná rozměrnost poměrně jednotná.

Konvoluční svazky využívají obdélníková jádra , která jsou přes rozměry vsunulá. Každé jádro v podstatě definuje sadu hmotností použitých v místních sousedstvích, označovaných jako aplikace jádra. Každá aplikace jádra odpovídá uzlu ve zdrojové vrstvě, který se označuje jako centrální uzel. Váhy jádra jsou sdíleny mezi mnoha připojeními. V konvoluční sadě je každé jádro obdélníkové a všechny aplikace jádra mají stejnou velikost.

Konvoluční sady podporují následující atributy:

InputShape definuje rozměry zdrojové vrstvy pro účely tohoto konvolučního svazku. Hodnota musí být řazená kolekce řazených celých čísel. Součin celých čísel se musí shodovat s počtem uzlů ve zdrojové vrstvě, ale v opačném případě nemusí odpovídat dimenzionální úrovni deklarované pro zdrojovou vrstvu. Délka této řazené kolekce členů se změní na hodnoturitu pro konvoluční svazek. Obvykle arity odkazuje na počet argumentů nebo operandů, které může funkce vzít.

K definování tvaru a umístění jader použijte atributy KernelShape, Stride, Padding, LowerPad a UpperPad:

  • KernelShape: (povinné) Definuje dimenzionalitu každého jádra pro konvoluční sadu. Hodnota musí být řazená kolekce kladných celých čísel s délkou, která se rovnáritu sady. Každá komponenta této řazené kolekce členů nesmí být větší než odpovídající komponenta InputShape.

  • Stride: (volitelné) Definuje velikost posuvných kroků konvoluce (velikost jednoho kroku pro každou dimenzi), která je vzdáleností mezi centrálními uzly. Hodnota musí být řazená kolekce kladných celých čísel s délkou, která jeritem sady. Každá součást této řazené kolekce členů nesmí být větší než odpovídající součást KernelShape. Výchozí hodnota je řazená kolekce členů se všemi komponentami rovna jedné.

  • Sdílení: (volitelné) Definuje sdílení hmotnosti pro každou dimenzi konvoluce. Hodnota může být jedna logická hodnota nebo řazená kolekce logických hodnot s délkou, která jerity sady. Jedna logická hodnota je rozšířena tak, aby byla řazená kolekce členů správné délky se všemi komponentami rovna zadané hodnotě. Výchozí hodnota je řazená kolekce členů, která se skládá ze všech hodnot True.

  • MapCount: (volitelné) Definuje počet map funkcí pro konvoluční sadu. Hodnota může být jedno kladné celé číslo nebo řazená kolekce kladných celých čísel s délkou, která je arity sady. Jedna celočíselná hodnota je rozšířena tak, aby byla řazená kolekce členů se správnými součástmi, přičemž první komponenty se rovnají zadané hodnotě a všechny zbývající součásti se rovnají jedné. Výchozí hodnota je 1. Celkový počet map funkcí je součin součástí řazené kolekce členů. Faktoring tohoto celkového počtu napříč komponentami určuje, jak jsou hodnoty mapování funkcí seskupeny v cílových uzlech.

  • Váhy: (volitelné) Definuje počáteční váhy pro svazek. Hodnota musí být řazená kolekce hodnot s plovoucí desetinou čárkou s délkou, která odpovídá počtu jader, kolikrát odpovídá počtu vah na jádro, jak je definováno dále v tomto článku. Výchozí váhy se náhodně generují.

Existují dvě sady vlastností, které řídí odsazení, které se vzájemně vylučují:

  • Odsazení: (volitelné) Určuje, zda má být vstup vložen pomocí výchozího schématu odsazení. Hodnota může být jedna logická hodnota, nebo to může být řazená kolekce logických hodnot s délkou, která jeritem sady.

    Jedna logická hodnota je rozšířena tak, aby byla řazená kolekce členů správné délky se všemi komponentami rovna zadané hodnotě.

    Pokud je hodnota dimenze True, zdroj je logicky vložen do této dimenze s buňkami s nulovou hodnotou, aby podporoval další aplikace jádra, aby centrální uzly prvního a posledního jádra v této dimenzi byly první a poslední uzly v této dimenzi ve zdrojové vrstvě. Počet "fiktivních" uzlů v každé dimenzi se tedy určí automaticky, aby se přesně vešly do (InputShape[d] - 1) / Stride[d] + 1 vrstvy vlněného zdroje.

    Pokud je hodnota pro dimenzi False, jádra jsou definována tak, aby počet uzlů na každé straně, které jsou vynechány, je stejný (až do rozdílu 1). Výchozí hodnota tohoto atributu je řazená kolekce členů se všemi komponentami rovna false.

  • UpperPad a LowerPad: (volitelné) Poskytují větší kontrolu nad množstvím odsazení, které se má použít. Důležité: Tyto atributy lze definovat, pokud a pouze pokud výše uvedená vlastnost odsazení není definována. Hodnoty by měly být celé číslo-hodnota řazené řazené kolekce členů s délkami, které jsou arity sady. Při zadání těchto atributů se na dolní a horní konce každé dimenze vstupní vrstvy přidají fiktivní uzly. Počet uzlů přidaných do dolních a horních konců v každé dimenzi určuje LowerPad[i] a UpperPad[i] v uvedeném pořadí.

    Aby se zajistilo, že jádra odpovídají pouze "skutečným" uzlům, a ne k "fiktivním" uzlům, musí být splněny následující podmínky:

    • Každá součást LowerPad musí být přísně menší než KernelShape[d]/2.

    • Každá součást UpperPad nesmí být větší než KernelShape[d]/2.

    • Výchozí hodnota těchto atributů je řazená kolekce členů se všemi komponentami rovna 0.

      Nastavení Odsazení = true umožňuje tolik odsazení, kolik je potřeba k zachování "středu" jádra uvnitř skutečného vstupu. Tím se matematika trochu změní pro výpočet velikosti výstupu. Obecně platí, že velikost výstupu D se vypočítá jako D = (I - K) / S + 1, kde I je vstupní velikost, K je velikost jádra, S je krok a / je celé číslo dělení (zaokrouhlené směrem k nule). Pokud nastavíte UpperPad = [1, 1], velikost I vstupu je efektivně 29, a proto D = (29 - 5) / 2 + 1 = 13. Nicméně, když Odsazení = true, v podstatě I se dostane nahoru ; K - 1tedy D = ((28 + 4) - 5) / 2 + 1 = 27 / 2 + 1 = 13 + 1 = 14. Zadáním hodnot pro UpperPad a LowerPad získáte mnohem větší kontrolu nad odsazením, než kdybyste právě nastavili odsazení = true.

Další informace o konvolučních sítích a jejich aplikacích najdete v těchto článcích:

Sdružování balíčků

Sada fondů používá geometrii podobnou konvolučnímu připojení, ale k odvození hodnoty cílového uzlu používá předdefinované funkce. Proto svazky sdružování nemají žádný trénovatelný stav (váhy nebo předsudky). Balíčky sdružování podporují všechny konvoluční atributy s výjimkou Sdílení, MapCount a Váhy.

Jádra souhrnná sousedními jednotkami sdružování se obvykle nepřekrývají. Pokud se Stride[d] rovná Hodnotě JádraShape[d] v každé dimenzi, je získaná vrstva tradiční místní vrstvou sdružování, která se běžně používá v konvolučních neurálních sítích. Každý cílový uzel vypočítá maximální nebo střední hodnotu aktivit jádra ve zdrojové vrstvě.

Následující příklad znázorňuje sadu fondů:

hidden P1 [5, 12, 12]
  from C1 max pool {
  InputShape  = [ 5, 24, 24];
   KernelShape = [ 1,  2,  2];
   Stride      = [ 1,  2,  2];
  }
  • Arity svazku je 3: to znamená délka řazených kolekcí InputShapečlenů , KernelShapea Stride.
  • Počet uzlů ve zdrojové vrstvě je 5 * 24 * 24 = 2880.
  • Jedná se o tradiční místní vrstvu sdružování, protože KernelShape a Stride jsou stejné.
  • Počet uzlů v cílové vrstvě je 5 * 12 * 12 = 1440.

Další informace o vrstvách sdružování najdete v těchto článcích:

Sady normalizace odpovědí

Normalizace odpovědí je místní normalizační schéma, které bylo poprvé představeno Geoffrey Hinton, et al, v paper ImageNet Classification with Deep Convolutional Neural Networks.

Normalizace odpovědí se používá k podpoře generalizace v neurálních sítích. Když se jeden neuron spouští na velmi vysoké úrovni aktivace, vrstva normalizace místní reakce potlačí úroveň aktivace okolních neuronů. To se provádí pomocí tří parametrů (αa β) a kkonvoluční struktury (nebo tvaru sousedství). Každý neuron v cílové vrstvě odpovídá neuronu x ve zdrojové vrstvě. Aktivační úroveň y je uvedena následujícím vzorcem, kde f je aktivační úroveň neuronu a Nx je jádro (nebo sada obsahující neurony v okolí x), jak je definováno následující konvoluční strukturou:

vzorec pro konvoluční strukturu

Sady normalizace odpovědí podporují všechny konvoluční atributy s výjimkou Sharing, MapCount a Weights.

  • Pokud jádro obsahuje neurony ve stejné mapě jako x, schéma normalizace se označuje jako stejné normalizace mapování. Pokud chcete definovat stejnou normalizaci mapování, musí mít první souřadnice v InputShape hodnotu 1.

  • Pokud jádro obsahuje neurony ve stejné prostorové poloze jako x, ale neurony jsou v jiných mapách, normalizační schéma se volá napříč normalizací map. Tento typ normalizace odpovědí implementuje formu laterální inhibice inspirované typem nalezeným v reálných neuronech, což vytváří konkurenci pro velké aktivační úrovně mezi výstupy neuronů vypočítanými na různých mapách. Aby bylo možné definovat normalizaci map, musí být první souřadnice celé číslo větší než jedno a nesmí být větší než počet map a zbytek souřadnic musí mít hodnotu 1.

Vzhledem k tomu, že sady normalizace odpovědí používají předdefinovanou funkci na hodnoty zdrojového uzlu k určení hodnoty cílového uzlu, nemají žádný trénovatelný stav (váhy nebo předsudky).

Poznámka:

Uzly v cílové vrstvě odpovídají neuronům, které jsou centrálními uzly jader. Pokud KernelShape[d] je například lichá, odpovídá KernelShape[d]/2 centrálnímu uzlu jádra. Pokud KernelShape[d] je to sudé, centrální uzel je v KernelShape[d]/2 - 1. Proto pokud Padding[d] je false, první a poslední KernelShape[d]/2 uzly nemají odpovídající uzly v cílové vrstvě. Chcete-li se této situaci vyhnout, definujte odsazení jako [true, true, ..., true].

Kromě čtyř atributů popsaných výše podporují sady normalizace odpovědí také následující atributy:

  • Alfa: (povinné) Určuje hodnotu s plovoucí desetinou čárkou, která odpovídá α předchozímu vzorci.
  • Beta: (povinné) Určuje hodnotu s plovoucí desetinou čárkou, která odpovídá β předchozímu vzorci.
  • Posun: (volitelné) Určuje hodnotu s plovoucí desetinou čárkou, která odpovídá k předchozímu vzorci. Výchozí hodnota je 1.

Následující příklad definuje sadu normalizace odpovědí pomocí těchto atributů:

hidden RN1 [5, 10, 10]
from P1 response norm {
  InputShape  = [ 5, 12, 12];
  KernelShape = [ 1,  3,  3];
  Alpha = 0.001;
  Beta = 0.75;
  }
  • Zdrojová vrstva obsahuje pět map, z nichž každá má rozměr 12 × 122, celkem v 1440 uzlech.
  • Hodnota KernelShape označuje, že se jedná o stejnou vrstvu normalizace mapy, kde okolí je obdélník 3x3.
  • Výchozí hodnota Odsazení je False, takže cílová vrstva má v každé dimenzi pouze 10 uzlů. Pokud chcete do cílové vrstvy zahrnout jeden uzel, který odpovídá každému uzlu ve zdrojové vrstvě, přidejte odsazení = [true, true, true]; a změňte velikost RN1 na [5, 12, 12].

Deklarace sdílené složky

Net# volitelně podporuje definování více sad se sdílenými váhami. Váhy libovolných dvou svazků lze sdílet, pokud jsou jejich struktury stejné. Následující syntaxe definuje sady se sdílenými váhami:

share-declaration:
  share    {    layer-list    }
  share    {    bundle-list    }
  share    {    bias-list    }

  layer-list:
    layer-name    ,    layer-name
    layer-list    ,    layer-name

  bundle-list:
    bundle-spec    ,    bundle-spec
    bundle-list    ,    bundle-spec

  bundle-spec:
    layer-name    =>     layer-name

  bias-list:
    bias-spec    ,    bias-spec
    bias-list    ,    bias-spec

  bias-spec:
    1    =>    layer-name

  layer-name:
    identifier

Například následující deklarace sdílené složky určuje názvy vrstev, které označují, že se mají sdílet váhy i předsudky:

Const {
  InputSize = 37;
  HiddenSize = 50;
  }
input {
  Data1 [InputSize];
  Data2 [InputSize];
  }
hidden {
  H1 [HiddenSize] from Data1 all;
  H2 [HiddenSize] from Data2 all;
  }
output Result [2] {
  from H1 all;
  from H2 all;
  }
share { H1, H2 } // share both weights and biases
  • Vstupní funkce jsou rozdělené do dvou vstupních vrstev stejné velikosti.
  • Skryté vrstvy pak počítají funkce vyšší úrovně na obou vstupních vrstvách.
  • Deklarace sdílené složky určuje, že H1 a H2 se musí vypočítat stejným způsobem jako u příslušných vstupů.

Případně můžete zadat dvě samostatné deklarace sdílené složky následujícím způsobem:

share { Data1 => H1, Data2 => H2 } // share weights
<!-- -->
    share { 1 => H1, 1 => H2 } // share biases

Krátký formulář můžete použít pouze v případech, kdy vrstvy obsahují jeden svazek. Obecně platí, že sdílení je možné pouze tehdy, když je relevantní struktura stejná, což znamená, že mají stejnou velikost, stejnou konvoluční geometrii atd.

Příklady využití Net#

Tato část obsahuje několik příkladů, jak pomocí net# přidat skryté vrstvy, definovat způsob, jakým skryté vrstvy komunikují s jinými vrstvami, a vytvářet konvoluční sítě.

Definování jednoduché vlastní neurální sítě: Příklad Hello World

Tento jednoduchý příklad ukazuje, jak vytvořit model neurální sítě, který má jednu skrytou vrstvu.

input Data auto;
hidden H [200] from Data all;
output Out [10] sigmoid from H all;

Příklad znázorňuje některé základní příkazy následujícím způsobem:

  • První řádek definuje vstupní vrstvu (pojmenovanou Data). Když použijete auto klíčové slovo, neurální síť automaticky zahrne všechny sloupce funkcí ve vstupních příkladech.
  • Druhý řádek vytvoří skrytou vrstvu. Název H se přiřadí skryté vrstvě, která má 200 uzlů. Tato vrstva je plně připojená ke vstupní vrstvě.
  • Třetí řádek definuje výstupní vrstvu (pojmenovanou Out), která obsahuje 10 výstupních uzlů. Pokud se neurální síť používá ke klasifikaci, je na každou třídu jeden výstupní uzel. Identifikátor sigmoid klíčového slova označuje, že výstupní funkce se použije na výstupní vrstvu.

Definování více skrytých vrstev: příklad počítačového zpracování obrazu

Následující příklad ukazuje, jak definovat o něco složitější neurální síť s více vlastními skrytými vrstvami.

// Define the input layers
input Pixels [10, 20];
input MetaData [7];

// Define the first two hidden layers, using data only from the Pixels input
hidden ByRow [10, 12] from Pixels where (s,d) => s[0] == d[0];
hidden ByCol [5, 20] from Pixels where (s,d) => abs(s[1] - d[1]) <= 1;

// Define the third hidden layer, which uses as source the hidden layers ByRow and ByCol
hidden Gather [100]
{
from ByRow all;
from ByCol all;
}

// Define the output layer and its sources
output Result [10]
{
from Gather all;
from MetaData all;
}

Tento příklad znázorňuje několik funkcí jazyka specifikace neurálních sítí:

  • Struktura má dvě vstupní vrstvy Pixels a MetaData.
  • Vrstva Pixels je zdrojová vrstva pro dva svazky připojení, s cílovými vrstvami ByRow a ByCol.
  • Vrstvy Gather a Result jsou cílové vrstvy v několika svazcích připojení.
  • Výstupní vrstva je cílová vrstva Resultve dvou svazcích připojení; jedna s druhou vrstvou skrytou Gather jako cílovou vrstvou a druhá s vstupní vrstvou MetaData jako cílovou vrstvou.
  • Skryté vrstvy ByRow a ByColzadejte filtrované připojení pomocí predikátových výrazů. Přesněji řečeno, uzel v ByRow hodnotě [x, y] je připojený k uzlům, ve Pixels kterých je první souřadnice indexu rovna první souřadnici uzlu x. Podobně je uzel v ByCol hodnotě [x, y] připojený k uzlům, které Pixels mají druhou souřadnici indexu v rámci jedné z druhé souřadnice y y.

Definování konvoluční sítě pro klasifikaci s více třídami: příklad rozpoznávání číslic

Definice následující sítě je navržená tak, aby rozpoznala čísla a ilustruje některé pokročilé techniky přizpůsobení neurální sítě.

input Image [29, 29];
hidden Conv1 [5, 13, 13] from Image convolve
  {
  InputShape  = [29, 29];
  KernelShape = [ 5,  5];
  Stride      = [ 2,  2];
  MapCount    = 5;
  }
hidden Conv2 [50, 5, 5]
from Conv1 convolve
  {
  InputShape  = [ 5, 13, 13];
  KernelShape = [ 1,  5,  5];
  Stride      = [ 1,  2,  2];
  Sharing     = [false, true, true];
  MapCount    = 10;
  }
hidden Hid3 [100] from Conv2 all;
output Digit [10] from Hid3 all;
  • Struktura má jednu vstupní vrstvu, Image.

  • Klíčové slovo convolve označuje, že vrstvy pojmenované Conv1 a Conv2 jsou konvoluční vrstvy. Za každou z těchto deklarací vrstev následuje seznam atributů konvoluce.

  • Síť má třetí skrytou vrstvu, Hid3která je plně připojena k druhé skryté vrstvě, Conv2.

  • Výstupní vrstva , Digitje připojena pouze k třetí skryté vrstvě , Hid3. Klíčové slovo all označuje, že výstupní vrstva je plně připojena k Hid3.

  • Arity konvoluce jsou tři: délka řazených kolekcí InputShapečlenů , KernelShape, Stridea Sharing.

  • Počet hmotností na jádro je 1 + KernelShape\[0] * KernelShape\[1] * KernelShape\[2] = 1 + 1 * 5 * 5 = 26. Nebo 26 * 50 = 1300.

  • Uzly v každé skryté vrstvě můžete vypočítat následujícím způsobem:

    NodeCount\[0] = (5 - 1) / 1 + 1 = 5 NodeCount\[1] = (13 - 5) / 2 + 1 = 5 NodeCount\[2] = (13 - 5) / 2 + 1 = 5

  • Celkový počet uzlů lze vypočítat pomocí deklarované rozměrové dimenze vrstvy [50, 5, 5], následujícím způsobem: MapCount * NodeCount\[0] * NodeCount\[1] * NodeCount\[2] = 10 * 5 * 5 * 5

  • Protože Sharing[d] je false pouze pro d == 0, počet jader je MapCount * NodeCount\[0] = 10 * 5 = 50.

Poděkování

Jazyk Net# pro přizpůsobení architektury neurálních sítí byl vyvinut v Microsoftu společností Shon Katzenberger (architect, Machine Learning) a Alexey Kamenev (softwarový inženýr, Microsoft Research). Používá se interně pro projekty a aplikace strojového učení od detekce obrázků až po analýzu textu. Další informace najdete v tématu Neurální sítě v nástroji Machine Learning Studio – úvod do netu#