2

我查看了 Lenet 的 Python示例,发现运行整个 MNIST 测试数据集所需的迭代次数是硬编码的。但是,这个值可以不被硬编码吗?如何在python中获取网络指向的数据集的样本数?

4

2 回答 2

3

您可以使用该lmdb库直接访问 lmdb

import lmdb
db = lmdb.open('/path/to/lmdb_folder')       //Needs lmdb - method
num_examples = int( db.stat()['entries'] )

应该为您解决问题。

于 2015-12-06T12:43:44.167 回答
1

您似乎在一个问题中混合了迭代样本数量。在提供的示例中,我们只能看到迭代次数,即训练阶段将重复多少次。迭代量(网络训练参数)和数据集中的样本量(网络输入)之间没有任何直接关系。

一些更详细的解释:

编辑Caffe将完全加载(批量大小x迭代)样本进行训练或测试,但与加载样本的数量实际数据库大小无关:它将在达到数据库最后一条记录后从头开始读取 - 换句话说,caffe中的数据库就像一个循环缓冲区

提到的例子指向这个配置。我们可以看到它需要lmdb输入,并将批量大小设置为64 (有关批次和 BLOB的更多信息)用于训练阶段和100用于测试阶段。实际上,我们没有对输入数据集的大小做出任何假设,即数据集中的样本数量批量大小只是处理块大小,迭代是caffe需要多少批次。到达数据库结束后它不会停止。

换句话说,网络本身(即protobuf配置文件)并不指向数据库中任何数量的样本- 仅指向数据集名称和格式以及所需的样本数量。据我所知,目前无法使用caffe确定数据库大小。

因此,如果您想加载整个数据集进行测试,您只能选择首先手动确定mnist_test_lmdbmnist_train_lmdb的样本数量,然后为批量大小迭代指定相应的值。

你有一些选择:

  1. 查看./examples/mnist/create_mnist.sh控制台输出 - 它在从初始格式转换时打印大量样本(我相信您遵循了本教程);
  2. 遵循@Shai 的建议(直接阅读 lmdb 文件)。
于 2015-12-09T00:12:39.517 回答