Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
(Hinweis: Ältere Versionen von CNTK verwendet "MEL" (Modellbearbeitungssprache) für diese Zwecke. Wir befinden uns immer noch im Prozess der Konvertierung der Beispiele. Dokumentation zu MEL finden Sie hier.)
CNTK ermöglicht es Modellen, nach der Tatsache bearbeitet zu werden. Dies erfolgt durch das Erstellen eines neuen Modells beim Klonen (Teile) eines vorhandenen Modells mit angewendeten Änderungen. Dazu bietet CNTK drei grundlegende Funktionen:
BS.Network.Load()zum Laden eines vorhandenen ModellsBS.Network.CloneFunction()so extrahieren Sie einen Abschnitt eines vorhandenen Modells für die WiederverwendungBS.Network.Edit()zum Klonen eines Modells mit Knoten-nach-Knoten-Änderungen angewendet
Der Bearbeitungsvorgang ist kein separater Schritt. Vielmehr würde ein Befehl, der ein geändertes Modell ausarbeiten sollte, nicht angeben modelPath , dass das Modell geladen wird, sondern ein BrainScriptNetworkBuilder Abschnitt, der das Modell innerhalb lädt und ein neues Modell aus dem geladenen Modell erstellt.
Beispiel: Diskriminative Vorschulung
Diskriminative Vorschulung ist eine Technik, in der ein tiefes Netzwerk durch Schulung einer Sequenz von flacheren Netzwerken erstellt wird. Beginnen Sie mit einem 1-ausgeblendeten Schichtnetzwerk, trainieren Sie die Teilkonverknung, entfernen Sie dann die Ausgabeebene, fügen Sie eine neue ausgeblendete Ebene hinzu, und fügen Sie eine neue Ausgabeebene hinzu. Wiederholen Sie, bis die gewünschte Anzahl ausgeblendeter Ebenen erreicht wird.
Lassen Sie uns mit einem sehr einfachen Startmodell ausgehen
BrainScriptNetworkBuilder = [
N = 40; M = 9000; H = 512
W1 = Parameter (H, N); b1 = Parameter (H)
Wout = Parameter (M, H); bout = Parameter (M)
x = Input (N, tag=‘feature’) ; labels = Input (M, tag=‘labels’)
h1 = Sigmoid (W1 * x + b1)
z = Wout * h1 + bout
ce = CrossEntropyWithSoftmax (labels, z, tag=‘criterion’)
]
Lassen Sie uns dieses Modell trainieren und unter "model.1.dn" speichern. Als Nächstes möchten wir ein Modell mit zwei ausgeblendeten Ebenen trainieren, wobei die erste ausgeblendete Ebene aus den oben trainierten Werten initialisiert wird. Dazu erstellen wir eine separate Schulungsaktion, die ein neues Modell erstellt, aber Teile des vorherigen erstellen, wie folgt:
BrainScriptNetworkBuilder = {
# STEP 1: load 1-hidden-layer model
inModel = BS.Network.Load ("model.1.dnn")
# get its h1 variable --and also recover its dimension
h1 = inModel.h1
H = h1.dim
# also recover the number of output classes
M = inModel.z.dim
# STEP 2: create the rest of the extended network as usual
W2 = Parameter (H, H); b2 = Parameter (H)
Wout = Parameter (M, H); bout = Parameter (M)
h2 = Sigmoid (W2 * h1 + b2)
z = Wout * h2 + bout
ce = CrossEntropyWithSoftmax (labels, z, tag=‘criterion’)
}
Zunächst wird SCHRITT 1 verwendet Load() , um das Netzwerk in eine BrainScript-Variable zu laden. Das Netzwerk verhält sich wie ein BrainScript-Datensatz, wobei alle Knoten auf oberster Ebene (alle Knoten, die keine Oder in ihren Knotennamen enthalten .[ ) über die Datensatzsyntax zugänglich sind. Ein neues Netzwerk kann auf jeden Knoten in einem geladenen Netzwerk verweisen. In diesem Beispiel enthält das geladene Netzwerk einen Knoten, der die Ausgabe der ersten ausgeblendeten Ebene ist, und einen Knoten h1z , der die nicht normalisierte Log posterior-Wahrscheinlichkeit der Ausgabeklassen ist (Eingabe zur Softmax-Funktion). Auf beide Knoten kann über die Punktsyntax von BrainScript zugegriffen werden, z. B. inModel.h1 und inModel.z.
Beachten Sie, dass Konstanten nicht in Modellen gespeichert werden, also weder NM noch aus dem Modell verfügbar sind. Es ist jedoch möglich, sie aus dem geladenen Modell zu rekonstruieren. Für diesen Zweck verhalten sich Die Berechnungsknoten auch wie BrainScript-Datensätze und stellen eine dim Eigenschaft zur Verfügung.
Als Nächstes erstellt STEP 2 den Rest des neuen Netzwerks mit regulärem BrainScript. Beachten Sie, dass dieser neue Abschnitt einfach den Knoten h1 aus dem Eingabemodell als Eingabe verwendet, z. B. einen anderen Knoten. Das Verweisen auf einen Knoten aus dem Eingabenetzwerk macht automatisch alle Knoten, die dieser Knoten abhängig ist, auch teil des neu erstellten Netzwerks. Der Eingabeknoten x wird z. B. automatisch Teil des neuen Netzwerks.
Beachten Sie auch, dass die Ausgabeebene neu erstellt wird. Auf diese Weise werden die Modellparameter neu erstellt. (Um dies nicht zu tun und stattdessen die vorhandenen Parameter wiederzuverwenden inModel.Wout, könnte man verwenden, aber beachten Sie, dass es nicht sinnvoll ist, aus der Sicht des Netzwerkentwurfs in diesem bestimmten Beispiel.)
Beispiel: Verwenden eines vorab trainierten Modells
Im Folgenden finden Sie ein Beispiel für die Verwendung eines vorab trainierten Modells (aus der Datei "./featext.dnn") als Feature-Extraktor:
BrainScriptNetworkBuilder = {
# STEP 1: load existing model
featExtNetwork = BS.Network.Load ("./featext.dnn")
# STEP 2: extract a read-only section that is the feature extractor function
featExt = BS.Network.CloneFunction (
featExtNetwork.input, # input node that AE model read data from
featExtNetwork.feat, # output node in AE model that holds the desired features
parameters="constant") # says to freeze that part of the network
# STEP 3: define the part of your network that uses the feature extractor
# from the loaded model, which above we isolated into featExt().
# featExt() can be used like any old BrainScript function.
input = Input (...)
features = featExt (input) # this will instantiate a clone of the above network
# STEP 4: and add the remaining bits of the network in BrainScript, e.g.
h = Sigmoid (W_hid * features + b_hid) # whatever your hidden layer looks like
z = W_out * h + b_out
ce = CrossEntropyWithSoftmax (labels, z)
criterionNodes = (ce)
}
SCHRITT 1 verwendet Load() , um das Netzwerk in eine BrainScript-Variable zu laden.
SCHRITT 2 verwendet CloneFunction() zum Klonen des funktionsbezogenen Abschnitts aus dem geladenen Netzwerk, das das Unterdiagramm ist, mit dem eine Verbindung featExtNetwork.inputfeatExtNetwork.feathergestellt wird. Da wir angegeben parameters="constant"haben, werden alle Parameter, die featExtNetwork.feat abhängig sind, auch geklont und schreibgeschützt gemacht.
In SCHRITT 3 und 4 wird das neue Netzwerk definiert. Dies geschieht wie jedes andere BrainScript-Modell, nur dass wir jetzt die featExt() Funktion verwenden können.
Probleme mit Knotennamen mit .[ und ]
Um auf einen Knoten in einem Netzwerk zu verweisen, das diese Zeichen enthält . oder oder [], ersetzen Sie diese Zeichen durch _.
Wenn network z. B. ein Knoten mit dem Namen result.znetwork.result.z ", schlägt fehl; stattdessen sagennetwork.result_z.
Beispiel: Ändern von Knoten eines vorhandenen Netzwerks
Um innere Teile eines vorhandenen Netzwerks zu ändern, würde man das Netzwerk tatsächlich klonen, während Änderungen als Teil des Klonvorgangs angewendet werden. Dies wird von BS.Network.Edit(). Edit() wird über alle Knoten eines Netzwerks iteriert und bietet jedem Knoten, einem von einem, die von dem Aufrufer übergeben werden, lambda-Funktionen an. Diese Lambdafunktionen können dann den Knoten überprüfen und entweder den Knoten unmodifiziert zurückgeben oder einen neuen Knoten an seinem Ort zurückgeben. Edit() wird über Knoten in nicht angegebener Reihenfolge iteriert. Wenn ein Ersatzknoten auf einen Netzwerkknoten verweist, der wiederum ersetzt wurde, Edit() aktualisieren Sie als letzten Schritt alle solchen Verweise auf die jeweiligen Ersatze (aka "tun Sie das richtige").
TODO: Beispiel.
Weiter: Vollfunktionsreferenz