用什么单位来定义CNTK的纪元大小?

时间:2017-01-09 18:24:05

标签: python deep-learning cntk

如果我理解正确,在CNTK Python API Trainer.previous_minibatch_sample_count应该返回前一个小批量中的样本数(和NOT序列)。我可以看到它在LanguageUnderstanding示例中按预期工作(即最后一个minibatch中的样本数确实接近所使用的minibatch_size):

def hackWay(list: util.List[Instruction]): Unit = {

  val iterator = list.listIterator()
  while(iterator.hasNext) {
    iterator.next() match {
      case WhileStmt() => 
        iterator.set(CherryOnTop)
      case IfStmt() => // do nothing here
    }
  }
}

import collection.JavaConverters._

val instructions = new util.ArrayList[Instruction](List(WhileStmt(), IfStmt()).asJava)

hackWay(instructions)

println(instructions.asScala) // Buffer(CherryOnTop, IfStmt())

然而,如果我修改(单独的)SequenceClassification示例以使用ProgressPrinter(唯一的更改),我会得到以下输出:

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

在上面的输出中,培训师(40-50)报告的“样本数量”远小于minibatch_size(200)。我已经手动确认看起来Trainer正在返回miniatch中的SEQUENCES数量,而不是上述情况下的样本。

这是预期的吗?如果是这样,这里的逻辑是什么?

我可以看到一些教程/示例依赖于从Trainer.previous_minibatch_sample_count返回的值来确定纪元的结束......这总是可靠地工作吗?

1 个答案:

答案 0 :(得分:3)

为团队中的不同人员整理多个答案:

  • 训练员返回的计数是#labels,在这种情况下是#sequences。指定的minibatch_size是#samples(跨所有流),minibatch_source返回一批样本,使得没有流超过指定的数量。在这种情况下,特征流每个样本有多个单词,因此确定了边界阈值。

  • 培训师返回产生渐变的#samples,即标签数量。还可以考虑目标函数中总结的项目数。