次の方法で共有


BrainScript でモデルを操作方法トレーニングする

レイヤーごとのトレーニング

レイヤーごとのトレーニングを実行するには、構成ファイルで複数の "コマンド" を使用するだけです。各コマンドの種類は action=train です。

command = TrainLayer1:TrainLayer2:TrainLayer3:EndToEndTrain:Test:Output

TrainLayer1= [ 
   action = train
   ...
]

TrainLayer2= [ 
   action = train
   ...
]
...

マルチタスク目標を使用してトレーニングする

組み合わせた条件を BrainScript 式として定義するだけで、個々のタスクの損失 evaluationNodesをすべて監視できます。

task1loss = CrossEntropyWithSoftMax(prediction,label)
task2loss = SquareError(reconstruction,input)
mtloss = task1loss + Constant(0.3) .* task2loss 
criterionNodes = (mtloss)
evaluationNodes = (task1loss:task2loss)

画像に対する回帰モデルをトレーニングする

以下では、CNTK を使用して入力画像の 1 つ以上の浮動小数点値を予測する方法について説明します。 ユース ケースの例として、特定の画像内のオブジェクトの境界ボックス (x、y、w、h など) を予測します。 また、その車の画像を見るだけで車の価格を予測することも考えられます(実際には興味深いでしょう)。 ここでは、画像の平均 RGB 値 ([0, 1] に正規化) を予測するようにネットワークをトレーニングする非常に単純な例を使用します。 ただし、他のユース ケースにも同じ手順が適用されます。 手順は次のとおりです。

  1. イメージとグラウンド トゥルース回帰ラベルの両方をネットワークへの入力として定義する
  2. 回帰ラベルを使用して、一致する値の数を予測するネットワークを定義します
  3. 予測値とグラウンド 真理値を比較する損失関数を定義する
  4. 画像ラベルと回帰ラベルの両方を読み取るために、.cntk 構成ファイルのリーダー セクションを調整する

これを行う方法を次に示します。 完全な構成ファイルは Examples/Image/Regression/RegrSimple_CIFAR10.cntk の Examples フォルダーに含まれています。 このフォルダーには、画像データをダウンロードし、トレーニングとテストのための回帰のグラウンド トゥルースを生成するためのスクリプトも含まれています。

1-3) 入力、ネットワークおよび損失機能の定義:

    BrainScriptNetworkBuilder = [
        imageShape = 32:32:3
        featScale = Constant(1/256)
        labelDim = 3

        model (features) = {
            featNorm = Scale(features, featScale)
            h1 = LinearLayer {100,      init="gaussian", initValueScale=1.5} (featNorm)
            ol = LinearLayer {labelDim, init="gaussian", initValueScale=1.5} (h1)
        }.ol

        # inputs
        features = Input {imageShape}
        regrLabels = Input {labelDim}
        
        # apply model to features
        ol = model (features)

        # define regression loss
        # rmse = sqrt(SquareError(regrLabels, ol) / labelDim)
        sqerr = SquareError (regrLabels, ol)
        rmse = Sqrt (Constant(1/labelDim).* sqerr)

        featureNodes    = (features)
        labelNodes      = (regrLabels)
        criterionNodes  = (rmse)
        evaluationNodes = (rmse)
        OutputNodes     = (ol)
    ]
  1. ImageReader と CNTKTextFormatReader の両方を使用した複合リーダーの定義:
    reader = {
        verbosity = 0 ; randomize = true
        deserializers = ({
            type = "ImageDeserializer" ; module = "ImageReader"
            file = "$dataDir$/cifar-10-batches-py/train_map.txt"
            input = {
                features = { transforms = (
                    { type = "Scale" ; width = 32 ; height = 32 ; channels = 3 ; interpolations = "linear" } :
                    { type = "Transpose" }
                )}
                ignored = { labelDim = 10 }
            }
        } : {
            type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader"
            file = "$dataDir$/cifar-10-batches-py/train_regrLabels.txt"
            input = {
                regrLabels = { dim = 3 ; format = "dense" }
            }
        })
    }

リーダーは、ImageReader を使用して画像を読み取り、CNTKTextFormatReader を使用して回帰グラウンド トゥルース ラベルを読み取る複合リーダーです。 これを行う場合は、デシリアライザーの配列を定義し (使用) {...} : {...}、上記のネットワークで定義されている入力 (cf. features and regrLabels) を割り当てます。

この例を実行するための完全な構成ファイルと、そのフォルダー内の対応する Readme については、「 Examples/Image/Miscellaneous/CIFAR-10/06_RegressionSimple.cntk 」を参照してください。

複数ラベル分類子をトレーニングする

マルチラベル分類の場合、CrossEntropy は合計 1 の入力ベクトルのみを処理できるため、使用しないでください。 賢明な代替手段は、ロジスティック損失関数の合計を使用することです。

...
probabilities = DenseLayer {outputSize, activation=Sigmoid} (hidden)
logisticLoss = Logistic (multiLabels, probabilities)
trainingCriterion = (logisticLoss)
...

損失自体とは別に、間違った予測の数など、他のメトリックを監視することもできます。 これには組み込み式はありませんが、次のように表現できます。

...
hammingLoss (y, p) = ReduceSum (y != (p > 0.5))
hl = hammingLoss(multiLabels,probabilities)
evaluationNodes = (hl)
...

これは、y[i] が p[i]>0.5 と一致しない回数をカウントします。

シーケンス モデリングを順番に開始する

この 実践的なラボ では、CNTK テキスト形式などのシーケンス処理を開始するための主な要素と、さまざまな入力シーケンスに短いエイリアスを使用するようにリーダーを構成する方法について説明します。 grapheme-to-phoneme (G2P) の例は、実際のシーケンスからシーケンスへのタスクを示しています。

シーケンス間モデリングの重要な問題は、ビーム検索を使用してテスト データをデコードする方法です。 これは、最上位レベルのアクションが "書き込み" である構成のセクションで行うことができます。 デコードには、最も可能性の高い出力シーケンスを検索する必要があります。 CNTK には ビーム検索 デコーダーがあり、次のように呼び出すことができます。

BrainScriptNetworkBuilder = (BS.Seq2Seq.BeamSearchSequenceDecoderFrom (
                                        BS.Network.Load (decodeModelPath), beamSize))

指定した梁サイズでビーム検索を実行します。 ビームサイズが1の場合、特殊な最長一致デコーダーがあります

BrainScriptNetworkBuilder = (BS.Seq2Seq.GreedySequenceDecoderFrom (
                                        BS.Network.Load (decodeModelPath)))

G2P の例に示すように、両方のデコーダーにネットワークに固有の要件があります

DSSM (または畳み込み DSSM) モデルをトレーニングする

DSSM (またはディープ セマンティック類似性モデル) は、ソースとターゲットのテキストのペアでトレーニングされた DNN モデルであり、関連するソースとターゲットのテキストのペアが近い短いテキスト埋め込み領域を学習します。 モデルへのテキスト入力は、事前に計算されたトリグラム ハッシュで表されます ( 「黄」を参照)。 C-DSSM の場合、トリグラム ハッシュは単語ごとに計算され、テキスト内で単語が出現する順序で連結されます。 両方のモデルへの入力は固定サイズです。 50K のトリグラムを考慮すると、ソースとターゲット テキストに対応する DSSM 入力はそれぞれ長さ 50K のベクトルになります。 C-DSSM の場合、ベクトルの長さは 50K x n で、最初の n-1 ワード ベクトルは連結され、n 番目のベクトルにはテキスト内の残りのすべての単語に対応するベクトルの合計が含まれます。 テキストに n 語未満の単語がある場合は、ベクターの残りの部分にゼロが埋め込まれます。 画像の例えを描くには、C-DSSM のテキスト入力を、サイズが 10 x 1 と 50K のチャネルが形式で [C x H x W] 格納された画像と考えることができます。

この例では、CNTKTextFormatReader を使用して DSSM/C-DSSM モデルをトレーニングする方法を示します。 データには、2 つの特徴 (ソーステキストとターゲット テキスト) と 1 つのラベル (正のサンプルのみが含まれるため、トレーニング データの値 1 に常に設定されます) が含まれている必要があります。トレーニング中は、負のターゲットの例がランダム サンプリングによって生成されます。 リーダーの構成を次に示します。

reader = {
    verbosity   = 0
    randomize   = true

    deserializers = ({
        type    = "CNTKTextFormatDeserializer"
        module  = "CNTKTextFormatReader"
        file    = "data.txt"

        input = {
            Q   = { dim = 500000; format = "sparse" }
            D   = { dim = 500000; format = "sparse" }
            L   = { dim = 1;      format = "dense" }
        }
    })
}

入力データのサンプルと、

|L 1 |Q 482:1 761:1 1832:1 2117:1 12370:1 17131:1 17854:1 24976:1 27676:1 28055:1 28177:1 29507:1|D 482:1 761:1 1832:1 2117:1 12370:1 17131:1 17854:1 24976:1 27676:1 28055:1 28177:1 29507:1
|L 1 |Q 149:1 153:1 595:1 671:1 675:1 1110:1 1517:1 2077:1 2114:1 5533:1 5662:1 6886:1 6901:1 7294:1 12846:1 13033:1 16614:1 19425:1 22015:1 24839:1 24994:1 26196:1 26358:1 27565:1|D 149:1 153:1 595:1 671:1 675:1 1110:1 1517:1 2077:1 2114:1 5533:1 5662:1 6886:1 6901:1 7294:1 12846:1 13033:1 16614:1 19425:1 22015:1 24839:1 24994:1 26196:1 26358:1 27565:1
|L 1 |Q 187:1 2294:1 2800:1 6920:1|D 187:1 2294:1 2800:1 6920:1

そして最後に、ネットワーク定義は、

BrainScriptNetworkBuilder = {
    # Constants scalars
    isConvolutional     = true
    numWords            = (if isConvolutional then 10 else 1)
    numTrigramsPerWord  = 50000
    numHiddenNodes      = 300
    wordWindowSize      = 3
    numWindows          = numWords - wordWindowSize + 1
    numNeg              = 50

    # Constant tensors
    CONST_GAMMA     = Constant(10)
    CONST_SHIFT     = Constant(1)
    CONST_NEG       = Constant(numNeg)
    CONST_PAD_NEG   = Constant(0, rows=numNeg, cols=1)
    CONST_PAD_POS   = Constant(1, rows=1, cols=1)
    CONST_PAD       = Splice(CONST_PAD_POS : CONST_PAD_NEG, axis=1)

    # Inputs
    Q   = Input(500000)
    D   = Input(500000)
    L   = Input(1)

    qr      = if isConvolutional
                then TransposeDimensions(ReshapeDimension(Q, 1, numTrigramsPerWord:1:numWords), 1, 3)
                else Slice(0, numTrigramsPerWord, Q, axis=1)
    dr      = if isConvolutional
                then TransposeDimensions(ReshapeDimension(D, 1, numTrigramsPerWord:1:numWords), 1, 3)
                else Slice(0, numTrigramsPerWord, D, axis=1)

    qdssm   = Sequential (
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    qcdssm  = Sequential (
                ConvolutionalLayer {numHiddenNodes, (wordWindowSize:1), pad=false, activation=Tanh} :
                MaxPoolingLayer {(numWindows:1), stride=(1:1)} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    ddssm   = Sequential (
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    dcdssm  = Sequential (
                ConvolutionalLayer {numHiddenNodes, (wordWindowSize:1), pad=false, activation=Tanh} :
                MaxPoolingLayer {(numWindows:1), stride=(1:1)} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    qembed  = if isConvolutional
                then qcdssm
                else qdssm
    dembed  = if isConvolutional
                then dcdssm
                else ddssm

    qf  = qembed(qr)
    df  = dembed(dr)
    lf  = Times(CONST_PAD, L)
    c   = CosDistanceWithNegativeSamples(qf, df, CONST_SHIFT, CONST_NEG)
    s   = Slice(0, 1, c, axis=1, tag="output")
    ce  = CrossEntropyWithSoftmax(lf, Scale(CONST_GAMMA, c), tag="criterion")
}

注:

  • C-DSSM は DSSM よりも一貫して優れたパフォーマンスを発揮することが示されていますが、トレーニング速度も遅くなります (最大 5 ~ 10 倍遅くなる場合もあります)。 そのため、場合によっては、より多くのデータ (またはより多くのエポック) をトレーニングすることで、同じトレーニング時間で DSSM のパフォーマンスが向上することがあります。
  • 元の DSSM/C-DSSM は、クエリとドキュメントタイトルのペアでトレーニングされました。 ただし、 セッション クエリ ペアクエリ プレフィックスとサフィックスのペアなど、他の種類のデータをトレーニングすることで、短いテキスト間の他のリレーションシップを学習できます。

デコンボリューションとアンプールを使用してイメージ オート エンコーダーをトレーニングする

ここには手順 があります

高速 R CNN を使用して物体検出をトレーニングする

ここには手順 があります