コマンド ライン解析ルールを使用した BrainScript
次に、CNTKコマンド ライン解析規則について説明します。 CNTKは、タスクを完了するための多数のコンポーネントで構成されます。 これらのコンポーネントのほとんどは、機能するために使用できるいくつかの構成情報を必要とし、これらの構成パラメーターは、CNTKの構成ファイルを介して提供されます。
構成ファイルは、名前と値のペアのコレクションです。 構成データには、次のいずれかの種類を指定できます。
- 単純: 1 つの値が構成パラメーターに割り当てられます。 たとえば、「
deviceId = "Auto"
」のように入力します。 - 配列: 構成パラメーターには、均一な型である必要のない値の配列が割り当てられます。
:
は配列の既定の区切り記号です。 配列の値をかっこで囲み、開いているかっこの直後に新しい区切り文字を配置することで、区切り記号を変更できます。 この文字を*
使用すると、配列内で特定の値を複数回繰り返すことができます。 たとえば、次minibatchSize = 256:512:512:512:1024
のようになりますminibatchSize = 256:512*3:1024
。 - Set: パラメーター セットには、任意の型の構成パラメーターのセットが含まれています。 パラメーター セットは入れ子にすることができます。 パラメーター セットの既定の区切り記号は、
;
複数の項目が 1 行に含まれている場合です。 行区切り記号は、項目の区切り記号としても機能します。 次に例を示します。
block1 = [id=1;size=256]
block2 = [
subblock = [string="hi";num=5]
value = 1e-10
array = 10:"this is a test":1.25
]
CNTKでは、構成ファイルは階層形式で整理されます。 実際のデータ値は、CNTK コンポーネントが値を要求するまで評価されません。 コンポーネントによって値が要求されると、CNTKは最初にコンポーネント ブロック内を検索します。 値が見つからない場合は、パラメーターが見つかるまで、または構成階層の最上位レベルに達するまで、親パラメーターと祖父母パラメーター セットが引き続き検索されます。 これにより、異なるブロック間で同じパラメーター値を簡単に共有できます。 前に説明したように、CNTK実行するには、要求された構成ファイルが読み込まれるのcntk configFile=yourExp.cntk
で、コマンド ラインで構成ファイルを指定し、構成ファイルのコマンド パラメーターに一覧表示されているコマンド ブロックを実行する必要があります。
コマンドとアクション
構成ファイルで実行されるコマンド (区切り :
) を定義する最上位レベルのコマンド パラメーターが必要です。 各コマンドは、ファイル内のコマンド ブロックを参照します。このブロックは、ブロックが実行する操作を定義するアクション パラメーターを含む必要があります。 たとえば、次のコマンドは、トレーニング アクションを mnistTrain
実行するブロックと、モデルを mnistTest
評価するブロックを実行します。
command = mnistTrain:mnistTest
mnistTrain = [
action = "train"
...
]
mnistTest = [
action = "eval"
...
]
コマンド ラインでの構成のオーバーロード
基本構成として使用できる構成を用意し、実験実行ごとにいくつかのパラメーターのみを変更するのが一般的です。 これは、いくつかの異なる方法で行うことができます。そのうちの 1 つは、コマンド ラインの設定をオーバーライドすることです。 たとえば、モデル ファイルのパスをオーバーライドするには、コマンド ラインを次のように簡単に変更できます。
cntk configFile=yourExp.cntk stderr="c:\temp\newpath"
これにより、構成ファイルのルート レベルで定義されている現在の設定 stderr
が、新しい値でオーバーライドされます。 コマンド ブロック内のパラメーターを変更する必要がある場合は、ブロックも指定する必要があります。 たとえば、コマンド ラインで実験の値を minibatchSize
次のように変更できます。
cntk configFile=yourExp.cntk mnistTrain=[minibatchSize=256]
または、実験に使用されるデータ ファイルを次のように変更します。
cntk configFile=yourExp.cntk mnistTrain=[reader=[file="mynewfile.txt"]]
階層化された構成ファイル
コマンド ライン パラメーターを使用して構成ファイルの一部をオーバーライドする代わりに、複数の構成ファイルを指定することもできます。後者のファイルは、前のファイルをオーバーライドします。 これにより、ユーザーはマスター構成ファイルを持ち、別の構成ファイルで、指定したCNTKの実行に対してオーバーライドするマスターのパラメーターを指定できます。 これを行うには、構成ファイルの '+' 区切りリストを指定するか、タグを configFile=
複数回使用します。 次の 2 つは等価です。
cntk configFile=yourExp1.cntk+yourExp2.cntk
cntk configFile=yourExp1.cntk configFile=yourExp2.cntk
文字列mnistTrain=[reader=[file=mynewfile.txt]]
のみが含まれている場合yourExp2.cntk
、これらのコマンドの両方が次のようになります。
cntk configFile=yourExp1.cntk mnistTrain=[reader=[file="mynewfile.txt"]]
変数の値は、最後に割り当てられた時点で常に決定されることに注意してください。 コマンド ライン パラメーターとレイヤー構成ファイルを任意の組み合わせで混在させることもできます。 たとえば、次のように入力します。
cntk configFile=yourExp1.cntk+yourExp2.cntk var1=value configFile=yourExp3.cntk
では、これらの構成パラメーターはコマンド ラインに表示される順序で処理され、最後に割り当てられた値は使用される値です。
コマンド ラインで複数の構成ファイルを指定できることに加えて、ユーザーは別の構成ファイル内に 1 つの構成ファイルを含めることができます。 たとえば、最初の yourExp2.cntk
行が
include=yourExp1.cntk
その後、単に実行
cntk configFile=yourExp2.cntk
実行と同じになります
cntk configFile=yourExp1.cntk+yourExp2.cntk
この後者の場合、 yourExp2.cntk
include ステートメントは含まれません。 これらのインクルード ステートメントは、構成ファイル内の任意の場所に表示できることに注意してください。include ステートメントが表示される場所は、指定された構成ファイルが含まれる場所です。 構成ファイルを含めるのは、そのファイルの内容を include ステートメントの場所に貼り付けるのと同じです。 Include ステートメントは再帰的に解決されます (深さ優先検索yourExpA.cntk
yourExpA.cntk
yourExpB.cntk
yourExpB.cntk
yourExpC.cntk
yourExpC.cntk
を使用)。 構成ファイルが複数回含まれている場合 (たとえば、'A' には 'B' と 'C' が含まれており、'B' には 'C' も含まれます)、実質的には初めて検出されたときにのみ含まれます。
変数の文字列化
レイヤー化された構成ファイルを使用すると、ユーザーは複数の実験で構成ファイルを再利用できますが、これは依然として面倒なプロセスになる可能性があります。 実験ごとに、ユーザーは複数のパラメーターをオーバーライドする必要があり、その一部は長いファイル パス (例: , stderr
, modelPath
file
) である可能性があります。 "文字列化" 機能を使用すると、このプロセスがはるかに簡単になります。 これにより、ユーザーは次のような構成を指定できます。
command = SpeechTrain
stderr = "$Root$\$RunName$.log"
speechTrain = [
modelPath = "$Root$\$RunName$.cn"
SGD = [
reader = [
features = [
type = "real"
dim = "$DataSet1_Dim$"
file = "$DataSet1_Features$"
]
]
]
]
ここでは、Root
(RunName
DataSet1_Dim
DataSet1_Features
使用されているポイントから見えるスコープで) 構成内の他の場所で指定された変数です。 この構成ファイルを解釈する場合、パーサーはフォーム $VarName$
のすべての文字列を文字列 VarValue
に置き換えます。これは VarValue
、呼び出された VarName
変数の値を表します。 変数解決プロセスは再帰的です。たとえば、A=$B$、B=$C$、C=HelloWorld.txtの場合、A は "HelloWorld.txt" として解決されます。 構成ファイルに参照ループがないことを確認してください。 それ以外の場合、パーサーはこの時点で無限ループに入ります。
ユーザーが構成ファイル内の変数の値をコマンド ラインで指定するのと同じであるため、これらの変数の値はどちらの場所でも指定できます。 変数の値は、最後に割り当てられた時点、それが構成ファイル内にあるかどうか、またはコマンド ラインで決定されることを思い出してください。 したがって、config1.txtで定義されているが、コマンド ラインでオーバーライドされた場合 Root
、コマンド ラインで指定された値は、configFile1.txt内のインスタンスを $Root$
解決するために使用される値になります。 1 つの便利な機能は、存在しないディレクトリを指している場合stderr
modelPath
、これらのディレクトリはCNTKによって作成されます。これにより、ディレクトリ$Root$\$RunName$
が存在しない場合でも、次のようなものstderr = $Root$\$RunName$\$RunName$.log
を指定できます。
既定値、繰り返し値、およびコメント
構成ファイルのほとんどのパラメーターには既定値があり、構成値が指定されていない場合に使用されます。 既定値がなく、検索で値が見つからない場合は、例外が表示され、プログラムが終了します。 パラメーター名を複数回指定した場合、その値に設定された最後の値が維持されます。 これに対する唯一の例外は、中かっこで [
囲まれたパラメーター セットです。これらの場合、中かっこ ]
内の値はパラメーター セットと見なされ、現在既存のパラメーター セットに追加されます。 次に例を示します。
params=[a=1;b=2;c=3]
params=[c=5;d=6;e=7]
は実質的に次のようになります。
params=[a=1;b=2;c=5;d=6;e=7]
この追加処理は配列要素には使用されず、配列全体が複数回設定されている場合は置き換えられます。 文字は #
コメントの先頭を示し、その後 #
に発生するすべてのものは無視されます。 #
コメントとして解釈するには、先頭に空白文字を付けるか、行の先頭に置く必要があります。 有効なコメントを次に示します。
stderr="c:\cntk\log\cntk" # "_mnistTrain_mnistTest.log"
コメントとして解釈されない値の例を次に示します。 in はコメント マーカーではないため、パラメーターvar
を#
1#INF
無限大に設定します
var=1#INF