如果我理解正确,在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返回的值来确定纪元的结束......这总是可靠地工作吗?
答案 0 :(得分:3)
为团队中的不同人员整理多个答案:
训练员返回的计数是#labels,在这种情况下是#sequences。指定的minibatch_size是#samples(跨所有流),minibatch_source返回一批样本,使得没有流超过指定的数量。在这种情况下,特征流每个样本有多个单词,因此确定了边界阈值。
培训师返回产生渐变的#samples,即标签数量。还可以考虑目标函数中总结的项目数。