2

私が正しく理解している場合、CNTK Python API Trainer.previous_minibatch_sample_count では、前のミニバッチのサンプル数 (シーケンスではなく) を返すことになっています。LanguageUnderstanding の例で期待どおりに動作することがわかります (つまり、最後のミニバッチのサンプル数は、実際に使用されている minibatch_size に近いです)。

minibatch_size = 70
...
Minibatch[   1-   1]: loss = 4.857261 * 67, metric = 100.0% * 67
Minibatch[   2-   2]: loss = 4.835442 * 63, metric = 60.3% * 63
Minibatch[   3-   3]: loss = 4.798552 * 68, metric = 36.8% * 68
Minibatch[   4-   4]: loss = 4.751775 * 70, metric = 35.7% * 70
Minibatch[   5-   5]: loss = 4.678326 * 65, metric = 30.8% * 65

ただし、(別の) SequenceClassification の例を変更して ProgressPrinter (唯一の変更) を使用すると、次の出力が得られます。

minibatch_size = 200
...
Minibatch[   1-   1]: loss = 1.611397 * 44, metric = 88.6% * 44
Minibatch[   2-   2]: loss = 1.611021 * 47, metric = 91.5% * 47
Minibatch[   3-   3]: loss = 1.608516 * 42, metric = 88.1% * 42
Minibatch[   4-   4]: loss = 1.611613 * 44, metric = 93.2% * 44
Minibatch[   5-   5]: loss = 1.610344 * 47, metric = 93.6% * 47

上記の出力では、トレーナーによって報告された「サンプル数」(40 ~ 50) は、minibatch_size (200) よりもかなり少なくなっています。上記のケースでは、Trainer がミニバッチでサンプルではなく SEQUENCES の数を返しているように見えることを手動で確認しました。

これは何か期待されていますか?もしそうなら、ここでの論理は何ですか?

一部のチュートリアル/例では、エポックの終わりを判断するために、Trainer.previous_minibatch_sample_count から返された値に依存していることがわかります。これは常に確実に機能しますか?

4

1 に答える 1

3

チーム内のさまざまな人々の複数の回答を照合する:

  • トレーナーが返すカウントは #labels で、この場合は #sequences です。指定された minibatch_size は #samples (すべてのストリームにわたって) であり、minibatch_source は指定されたカウントを超えるストリームがないようにサンプルのバッチを返します。この場合、機能ストリームにはサンプルごとに複数の単語が含まれるため、境界しきい値が決定されます。

  • トレーナーは、勾配を生じさせる #samples、つまりラベルの数を返します。目的関数にまとめられたアイテムの数とも考えられます。

于 2017-01-09T20:17:11.493 に答える