我查看了 Lenet 的 Python示例,发现运行整个 MNIST 测试数据集所需的迭代次数是硬编码的。但是,这个值可以不被硬编码吗?如何在python中获取网络指向的数据集的样本数?
2 回答
您可以使用该lmdb
库直接访问 lmdb
import lmdb
db = lmdb.open('/path/to/lmdb_folder') //Needs lmdb - method
num_examples = int( db.stat()['entries'] )
应该为您解决问题。
您似乎在一个问题中混合了迭代和样本数量。在提供的示例中,我们只能看到迭代次数,即训练阶段将重复多少次。迭代量(网络训练参数)和数据集中的样本量(网络输入)之间没有任何直接关系。
一些更详细的解释:
编辑:Caffe将完全加载(批量大小x迭代)样本进行训练或测试,但与加载样本的数量和实际数据库大小无关:它将在达到数据库最后一条记录后从头开始读取 - 换句话说,caffe中的数据库就像一个循环缓冲区。
提到的例子指向这个配置。我们可以看到它需要lmdb输入,并将批量大小设置为64 (有关批次和 BLOB的更多信息)用于训练阶段和100用于测试阶段。实际上,我们没有对输入数据集的大小做出任何假设,即数据集中的样本数量:批量大小只是处理块大小,迭代是caffe需要多少批次。到达数据库结束后它不会停止。
换句话说,网络本身(即protobuf配置文件)并不指向数据库中任何数量的样本- 仅指向数据集名称和格式以及所需的样本数量。据我所知,目前无法使用caffe确定数据库大小。
因此,如果您想加载整个数据集进行测试,您只能选择首先手动确定mnist_test_lmdb或mnist_train_lmdb中的样本数量,然后为批量大小和迭代指定相应的值。
你有一些选择:
- 查看
./examples/mnist/create_mnist.sh
控制台输出 - 它在从初始格式转换时打印大量样本(我相信您遵循了本教程); - 遵循@Shai 的建议(直接阅读 lmdb 文件)。