Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Zkopíruje část sítě modelu do funkce BrainScriptu.
BS.Network.CloneFunction (inputNodes, outputNodes,
parameters="learnable" /*|"constant"|"shared"*/)
Parametry
-
inputNodesje pole 1 nebo více vstupů. Uvádí uzly původní sítě, které jsou vstupy funkce, které se mají extrahovat. Při volání výsledné funkce BrainScriptu se parametry klonované funkce nahradí těmito uzly. -
outputNodesje jeden výstupní uzel nebo záznam několika výstupních uzlů. Tyto označují, které uzly ve původní síti představují výstup klonované funkce. Výsledná funkce BrainScriptu je vrátí. -
parametersurčuje, jak by se měly zacházet s naklonovanými parametry v klonovaném oddílu. Následující hodnoty jsou srozumitelné:-
"learnable": Každý naučitelný parametr v klonované funkci získá vlastní kopii, která se od této chvíle aktualizuje trénováním jako jakýkoli jiný parametr. Toto je výchozí hodnota. -
"constant": Naučitelné parametry se zkopírují, ale pak se zablokují. Klonovaná funkce nebude během dalšího trénování dostávat žádné aktualizace, například pokud chcete použít extraktor funkcí natrénovaný na velké standardní trénovací sadě v následném trénování menší vlastní sady. -
"shared": Původní naučitelné parametry budou nadále používány sdíleným způsobem. Během dalšího trénování se aktualizují z původního použití i klonovaného použití. Pokud je funkce BrainScript vrácenáCloneFunction()vyvolána vícekrát, všechny klony budou sdílet parametry.
-
Návratová hodnota
Funkce BrainScriptu, která přijímá tolik vstupních argumentů jako inputNodes, a vrátí skalár, pokud outputNodes je skalár, nebo záznam, pokud outputNodes je záznam s odpovídajícími názvy.
Popis
Původní sítí může být samostatná síť. To umožňuje importovat (součást) externí sítě, která byla natrénována na různých datech.
CloneFunction() umožňuje ukotvit parametry modelu klonu. To umožňuje, aby se externí síť používala jako extraktor pevných funkcí nebo aby fungovala jako regularizátor v nastavení přizpůsobení.
Původní síť může být také částí aktuálně definované sítě a klon může sdílet své parametry s původním. To umožňuje více identických cest přes síť provozující různá data, například pro nastavení, která symetricky porovnávají podobnost dvou vstupů, kde jsou vrstvy extrahování funkcí sdíleny (a společně se naučily) pro oba vstupy. V současné době to ale nefunguje, pokud část původní sítě obsahuje opakující se smyčku.
Oddíl, který se má zkopírovat, je definován vstupními a výstupními uzly. Představte si síťový graf, ve kterém je čára vykreslena kolem pododdílu, který se má naklonovat. Tento oddíl označený řádkem by pak byl určen předáním všech spojení, která přes čáru zadávají označenou oblast jako parametr inputNodes, a všechny, které se vydají jako outputNodes.
CloneFunction() tento oddíl extrahuje do funkce BrainScriptu s řadou parametrů, které se rovnají počtu inputNodes, a výstupem je jeden uzel nebo slovník uzlů.
Je také možné označit naučitelné parametry jako inputNodes. V tomto případě můžete do funkce BrainScriptu, která CloneFunction() vytvoří, nahradit nové parametry jako argumenty. Uděláte to, pokud chcete zkopírovat funkci, ale naučte se parametry úplně od začátku. V tomto případě je také možné změnit dimenze.
Příklady případů použití:
- adaptace (KL): zablokovaná kopie počátečního modelu jen pro čtení se používá jako KL-regularizer
- adaptace (FDLR): Vložená vstupní transformace se vytrénuje, zatímco síť je pevná.
- image: Nižší vrstvy sítí ImageNet slouží jako neměnné extraktory funkcí pro jinou úlohu image.
- DSSM: Použití stejné pododdílu sítě na dva vstupy
Problémy s názvy uzlů s .[ a ]
Chcete-li odkazovat na uzel v síti, která obsahuje . nebo [ nebo ], nahraďte tyto znaky _.
Například pokud network obsahuje uzel s názvem result.z, network.result.z selže; místo toho řekněte network.result_z.
Poznámka k implementaci
CloneFunction() ve skutečnosti nevytvoří kód BrainScriptu pod kapotou. Místo toho vytvoří objekt C++, který se chová jako funkce BrainScriptu.
CloneFunction() sám o sobě také nenaklonuje původní síť. Obsahuje jenom odkaz. Skutečné klonování nastane, když se volá funkce, která CloneFunction() vrátí.
Příklady
Základní použití:
# create a BS function by copying a piece of an existing network loaded from disk
network = BS.Network.Load ("some.dnn")
net = BS.Network.CloneFunction (network.features, network.logP)
# apply the copy to a new input
out = net (myFeatures)
# This will create a copy of the subsection from network.features to network.logP
# where all links to network.features get replaced by links to myFeatures.
Příklad s několika vstupními a výstupními uzly:
# This specific example passes two input nodes --> the resulting BS function will have 2 inputs;
# and it passes a record of output nodes --> the BS function will return a record with the same member names
network = BS.Network.Load ("some.dnn")
net = BS.Network.CloneFunction ((network.features:network.labels), [ ce = network.ce ; errs = network.errs ])
# 'net' is now a BrainScript function with this signature:
# CloneFunction (input1, input2) --> [ ce = ... ; errs = ... ]
# now create a network from the BS function
myFeatures = Input (13)
myLabels = Input (42)
out = net (myFeatures, myLabels) # e.g. myFeatures substitutes the original 'features' node
criterionNodes = (out.ce) # and the return value is a record with members 'ce' and 'errs'
evaluationNodes = (out.errs)
Konkrétní příklad: Přizpůsobení sítě při použití původní sítě jako regularizátoru (KLD):
# load network
network = BS.Network.Load ("some.dnn")
# create a trainable clone and a read-only reference clone
adaptNet = BS.Network.CloneFunction (network.features, [ z = network.z ], parameters="learnable")
refNet = BS.Network.CloneFunction (network.features, [ z = network.z ], parameters="constant")
# create the main network
features = Input (42)
labels = Input (9000)
z = adaptNet (features).z
zRef = refNet (features).z
# training criterion
# In KL adaptation, labels are a linear interpolation of the one-hot targets
# and the posteriors produced by the reference network.
refWeight = 0.9
kldLabels = labels * (1-refWeight) + Softmax (zRef) * refWeight # interpolate with ref output
ce = CrossEntropyWithSoftmax (kldLabels, z) # the CE criterion is taken against these interpolated soft labels
errs = ErrorPrediction (labels, z) # errors are of course still counted against the actual labels
criterionNodes = (ce)
evaluationNodes = (errs)