次の方法で共有


BrainScript ネットワーク ビルダー

カスタム ネットワークは、CNTK のカスタム ネットワーク記述言語 "BrainScript" で説明されています。カスタム ネットワークを定義するには、トレーニング構成に という名前 BrainScriptNetworkBuilder のセクションを含めます。 ネットワーク記述言語の詳細な説明については、「 基本概念 」ページと対応するサブページを参照してください。

BrainScript ネットワーク ビルダーを使用する 2 つの形式があります。1 つはかっこ (...)を使用し、短い形式は中かっこを使用します {...}。 外部ファイルでネットワークを記述するには、次のようなブロックを指定します。

BrainScriptNetworkBuilder = (new ComputationNetwork {
    include "yourNetwork.bs"
})

には yourNetwork.bs 、BrainScript を使用して記述されたネットワークが含まれています。 ファイルは、最初に構成ファイル yourNetwork.bs と同じディレクトリ内で検索され、見つからない場合は CNTK 実行可能ファイルのディレクトリで検索されます。 ここでは、絶対パス名と相対パス名の両方を受け入れます。 たとえば、 bs/yourNetwork.bs 構成ファイルの横のディレクトリ bs (または CNTK 実行可能ディレクトリ内のディレクトリ bs ) にあるファイルを意味します。

注: CNTK 1.6 までは、BrainScript は中かっこではなく角かっこ [...] を使用しました {...}。 角かっこは引き続き受け入れられますが、非推奨です。

または、構成ファイル内で直接、ネットワークをインラインで定義することもできます。 これにより、複数の構成で同じ頭脳スクリプトを共有する予定がない場合は、構成を簡略化できます。 次の形式を使用します。

BrainScriptNetworkBuilder = {
    # insert network description here
}

では、BrainScript コードはかっこ内に入るように見えますか? 詳細については、 BrainScript の基本的な概念に進んでください。

または、このページに留まり、必要な頻度が低い詳細についてお読みください。

上記のフォームは {...} 、実際にはこれに関する短い手です。

BrainScriptNetworkBuilder = (new ComputationNetwork {
    # insert network description here
})

最後に、高度な用途として、 (...) フォームは を使用 newするに限定されません。 代わりに、 のオブジェクト ComputationNetwork に評価される BrainScript 式は、かっこ内で使用できます。 次に例を示します。

BrainScriptNetworkBuilder = ({
    include "myNetworks.bs"
    network = CreateMyNetworkOfType42()
}.network)

これは、モデル編集のコンテキストでも発生する高度な用途です。

次へ: BrainScript の基本的な概念

レガシー NDLNetworkBuilder

以前のバージョンの CNTK では、ネットワーク ビルダーは と呼ばれます NDLNetworkBuilder。 その定義言語は BrainScript のサブセットです。 古いパーサーは能力が低かったが、より寛容だった。 その他の小さな違いもあります。

NDLNetworkBuilder は非推奨になりましたが、類似性により、 に BrainScriptNetworkBuilderアップグレードすることは困難ではありません。 ネットワークの説明を に変換 NDLNetworkBuilder する方法に関するガイドを次に BrainScriptNetworkBuilder示します。

から NDLNetworkBuilder への更新 BrainScriptNetworkBuilder

の既存のネットワーク定義を NDLNetworkBuilderBrainScriptNetworkBuilder 変換するのは、ほとんどの場合簡単です。 メインの変更は、周囲の構文です。 コア ネットワーク記述自体は、主に上位互換性があり、新しい言語機能を利用しない場合は同一またはほぼ同一である可能性があります。

説明を変換するには、ネットワーク ビルダーを切り替え、w.r.t. 外部構文を適合させ、場合によってはネットワーク コード自体に軽微な適応を加える必要があります。

手順 1. ネットワーク ビルダーの切り替え. を NDLNetworkBuilder CNTK 構成ファイル内の対応する BrainScriptNetworkBuilder ブロックに置き換えます。 ネットワークの説明が別のファイルにある場合:

# change from:
NDLNetworkBuilder = [
    ndlMacros = "shared.ndl"   # (if any)
    networkDescription = "yourNetwork.ndl"
]
# ...to:
BrainScriptNetworkBuilder = (new ComputationNetwork {
    include "shared.bs"        # (if any)
    include "yourNetwork.bs"
})

(ファイル名拡張子の変更は厳密には必要ありませんが、推奨されます)。

ネットワーク記述が構成ファイル自体にある .cntk 場合:

# change from:
NDLNetworkBuilder = [
    # macros
    load = [
        SigmoidNetwork (x, W, b) = Sigmoid (Plus (Times (W, x), b))
    ]
    # network description
    run = [
        feat = Input (13)
        ...
        ce = CrossEntropyWithSoftmax (labels, z, tag="criterion")
    ]
]
# ...to:
BrainScriptNetworkBuilder = {
    # macros are just defined inline
    SigmoidNetwork (x, W, b) = Sigmoid (Plus (Times (W, x), b))  # or: Sigmoid (W * x + b)
    # network description
    feat = Input {13}
    ...
    ce = CrossEntropyWithSoftmax (labels, z, tag="criterion")
}

手順 2. ブロックと ブロックをrun削除loadします。 ではBrainScriptNetworkBuilder、マクロ/関数定義とメインコードが組み合わされます。 ブロックと run ブロックはload、単に削除する必要があります。 次に例を示します。

load = ndlMnistMacros
run = DNN
ndlMnistMacros = [
    featDim = 784
    ...
    labels = InputValue(labelDim)
]
DNN = [
    hiddenDim = 200
    ...
    outputNodes = (ol)
]

単に次のようになります。

featDim = 784
...
labels = InputValue(labelDim)
hiddenDim = 200
...
outputNodes = (ol)

変数を run 使用して、外部変数を持つ複数の構成の 1 つを選択した可能性があります(例:

NDLNetworkBuilder = [
    run = $whichModel$   # outside parameter selects model, must be either "model1" or "model2"
    model1 = [ ... (MODEL 1 DEFINITION) ]
    model2 = [ ... (MODEL 1 DEFINITION) ]
]

NDL には条件式がないため、このパターンはほとんど必要でした。 BrainScript では、次の式を使用して if 記述されます。

BrainScriptNetworkBuilder = (new ComputationNetwork
    if      "$whichModel$" == "model1" then { ... (MODEL 1 DEFINITION) }
    else if "$whichModel$" == "model2" then { ... (MODEL 2 DEFINITION) }
    else Fail ("Invalid model selector value '$whichModel$'")
)

ただし、多くの場合、選択したモデルは非常に似ているので、説明をマージし、代わりに条件を内部で使用する方が、異なる場合にのみ使用することをお勧めします。 パラメーターを使用して、一方向 LSTM と双方向 LSTM のどちらかを選択する例を次に示します。

encoderFunction =
    if useBidirectionalEncoder
    then BS.RNNs.RecurrentBirectionalLSTMPStack
    else BS.RNNs.RecurrentLSTMPStack
encoder = encoderFunction (encoderDims, inputEmbedded, inputDim=inputEmbeddingDim)

手順 3. ネットワークの説明を調整する. ネットワーク記述 (数式) 自体に関しては、BrainScript は NDL とほとんど上位互換性があります。 メインの違いは次のとおりです。

  • マクロ (関数) の戻り値は、その中で定義された最後の変数ではなく、変数のセット全体です。 最後に出力値を明示的に選択する必要があります。 次に例を示します。

      # NDL:  
      f(x) = [  
          x2 = Times (x, x)  
          y = Plus (x2, Constant (1))  
      ]  # <-- return value defaults to last entry, i.e. y  
      # BrainScript:
      f(x) = {
          x2 = x*x  
          y = x2 + 1  
      }.y  # <-- return value y must be explicitly dereferenced
    

    この変更がないと、関数の戻り値はレコード全体になります。一般的なエラーは ComputationNode 、 が見つかった場所で ComputationNetwork が予期されていたということです。

  • BrainScript では、パラメーターの数が可変の関数は使用できません。 これは主に関数にとって Parameter() 重要です。ベクター パラメーターは、 として Parameter(N)書き込むことができなくなります。現在は、テンソル ParameterTensor{N} または 1 列の行列 Parameter(N, 1)として明示的に記述する必要があります。 この変更がないと、位置指定パラメーターの数の不一致に関するエラーが発生します。 この表記は NDL でも機能するため、この変更を最初に行い、変換する前に NDL でテストできます。 これは、レガシ名LearnableParameter()ParameterTensor{}の使用名を に変更する良い機会でもあります。

    また、BrainScript では入力の RowStack() 配列である 1 つのパラメーターを受け取る 関数についても重要です。 入力は、 ではなくコンマではなくコロン (:) でRowStack (a, b, c)区切る必要があります。 RowStack (a:b:c)

  • 一部の既定値は更新されました。主に の省略可能な imageLayout パラメーター Convolution()、プール操作、および ImageInput()です。 NDL の場合、これらは既定で に legacy設定されますが、cuDNN 畳み込みプリミティブとの互換性が必要な既定値 cudnn になります。 (すべての NDL コード サンプルでは、このパラメーターを既に指定 cudnn しています。

  • BrainScript のパーサーは、より制限が厳しくなっています。

    • 識別子では大文字と小文字が区別されるようになりました。 組み込み関数では、PascalCase (例: ) を使用し、組み込みの変数とパラメーター名は、オプション文字列 (init="fixedValue"tag="criterion") と同様に camelCase (例: 、 criterionNodes) を使用します。 RectifiedLinear()modelPath 省略可能なパラメーターの名前の場合、誤ったスペルが常にエラーとしてキャッチされるとは限りません。 代わりに、誤ったスペルの省略可能なパラメーターは無視されます。 たとえば、"特殊なノード" 定義があります。 それらの正しいスペルは次のとおりです。

        featureNodes    = ...
        labelNodes      = ...
        criterionNodes  = ...
        evaluationNodes = ...
        outputNodes     = ...
      
    • 省略された代替名は使用できなくなりました。たとえばConst()、 は にする必要 tag="eval"Constant()がありますtag="evaluation"。現在evalNodesevaluationNodesは です。

    • いくつかの誤ったスペルの名前が修正されました: criteria is now criterion (同様に criterionNodes) defaultHiddenActivity は、 になりました defaultHiddenActivation

    • 関数定義の = 符号は省略可能ではなくなりました。

    • ブロック ([ ... ]) に角かっこを使用することは許可されていますが、非推奨です。 中かっこ ({ ... }) を使用します。

    • オプション ラベルは、 ではなくinit=uniform文字列として引用符で囲む必要があります。 init="uniform" 引用符がないと、BrainScript はシンボル uniform が不明であることを示すエラー メッセージで失敗します。

    • パラメーター (Input{}ParameterTensor{}) を作成する BrainScript プリミティブでは、引数に中かっこを使用する必要があります (例: f = Input{42})。 これは、適用されない規則ですが、今後推奨されます。

    このより制限された構文は、 によって NDLNetworkBuilder引き続き受け入れられるので、実際に BrainScript に変更する前に、まずこれらの構文変更を行い、 NDL でテストすることをお勧めします。

手順 4. "write" セクションと "test" セクションから削除 NDLNetworkBuilder します。 セクションの "write" セクションと "test" セクションを NDLNetworkBuilder 確認し、削除してください。 いくつかのストック NDL の例には、余分な NDLNetworkBuilder セクションがあります。 これらは使用されず、そこにはいてはなりません。 構成がこれらの例のいずれかに基づいている場合は、このようなセクションもあります。 これらは以前は無視されていましたが、BrainScript の更新では、これらのセクションで新しいネットワークを定義する意味 (モデル編集) が含まれるようになったため、無視されなくなったため、削除する必要があります。

NDLNetworkBuilder reference (非推奨)

非推奨 NDLNetworkBuilder の の構文は次のとおりです。

NDLNetworkBuilder = [
    networkDescription = "yourNetwork.ndl"
]

ブロックには NDLNetworkBuilder 、次のパラメーターがあります。

  • networkDescription: ネットワーク記述ファイルのファイル パス。 非推奨 NDLNetworkBuilderの では、ファイル拡張子 .ndlを使用するのが慣例でした。 パラメーターが指定されていない networkDescription 場合、ネットワーク記述は同じ NDLNetworkBuilder サブブロック内でインライン化されたものと見なされ、以下の run パラメーターで指定されます。 パラメーターを使用して networkDescription 指定できるファイル パスは 1 つだけであることに注意してください。 マクロの複数のファイルを読み込むには、 パラメーターを ndlMacros 使用します。

  • run: 実行される NDL のブロック。 パラメーターを使用して外部 NDL ファイルを networkDescription 指定した場合、 run パラメーターはそのファイル内のブロックを識別します。 このパラメーターは、 run ファイルに既に存在する可能性があるパラメーターをオーバーライドします。 ファイルが指定されていない networkDescription 場合、 パラメーターは run 現在の構成ファイル内のブロックを識別します。

  • load: 読み込む NDL スクリプトのブロック。 複数のブロックは、":" 区切りリストを使用して指定できます。 パラメーターで指定されたブロックには、通常、 load ブロックで使用するマクロが run 含まれています。 パラメーターと同様にrun、 パラメーターはload外部 NDL ファイル内のブロックを識別し、 パラメーターでファイルが指定されている場合は、ファイルに既に存在する可能性があるパラメーターをnetworkDescriptionオーバーライドloadします。 ファイルが指定されていない networkDescription 場合は、 load 現在の構成ファイル内の ブロックを識別します。

  • ndlMacros: NDL マクロが読み込まれる可能性があるファイル パス。 通常、このパラメーターは、すべての NDL スクリプトで使用できる NDL マクロの既定のセットを読み込む場合に使用されます。 異なるマクロ セットを指定する複数の NDL ファイルは、この ndlMacros パラメーターのファイル パスの "+" 区切りリストを指定することで読み込むことができます。 NDL のモデル編集言語 (MEL) ブロックなどの他のコマンド ブロックとマクロを共有するには、構成ファイルのルート レベルでマクロを定義する必要があります。

  • randomSeedOffset: 学習可能なパラメーターを初期化するときの負でないランダム シード オフセット値。 既定値は 0 です。 これにより、ユーザーはさまざまなランダムな初期化で実験を実行できます。