如何在 python 中获取 Caffe 网络的数据集大小?

How to get the dataset size of a Caffe net in python?

我查看了 python example for Lenet,发现 运行 整个 MNIST 测试数据集所需的迭代次数是硬编码的。然而,这个值能不能完全不硬编码呢?如何获取python中网络指向的数据集的样本数?

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

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

应该能帮到你。

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

更详细的解释:

编辑Caffe 将完全加载(批量大小 x iterations) 用于训练或测试的样本,但与 加载样本量 实际数据库大小 没有关系:它将到达数据库最后一条记录后从头开始读取 - 换句话说,caffe 中的数据库就像 circular buffer.

提到的示例指向 this configuration. We can see that it expects lmdb input, and sets batch size to 64 (some more info about batches and BLOBs) 用于 training 阶段和 100 用于 testing阶段。实际上,我们不对输入 数据集大小 做任何假设,即。 e. 数据集中的样本数批量大小只是处理块大小,迭代次数是多少批次caffe 会用。到达数据库结束后不会停止。

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

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

你有一些选择:

  1. 查看 ./examples/mnist/create_mnist.sh 控制台输出 - 它在从初始格式转换时打印样本数量(我相信您已遵循 this tutorial);
  2. 按照@Shai 的建议(直接读取 lmdb 文件)。