【发布时间】:2019-03-16 20:09:57
【问题描述】:
我有一个为 caffe 制作的大 (> 1TB) lmdb 文件。生成需要很长时间。现在我想更改一些条目的标签。有没有办法在原地更改标签?有一个解决方法,我可以删除它们并将它们添加回来。但这会导致所有更改的标签(在我的例子中是一个新类)位于 lmdb 文件的末尾,我认为这不利于训练。
【问题讨论】:
我有一个为 caffe 制作的大 (> 1TB) lmdb 文件。生成需要很长时间。现在我想更改一些条目的标签。有没有办法在原地更改标签?有一个解决方法,我可以删除它们并将它们添加回来。但这会导致所有更改的标签(在我的例子中是一个新类)位于 lmdb 文件的末尾,我认为这不利于训练。
【问题讨论】:
经过一番搜索终于找到了解决方案。我可以使用替换功能,如https://lmdb.readthedocs.io/en/release/ 中所述。
这里是解决方案的代码sn-p:
map_size = N
env = lmdb.open(lmdb_name, map_size=map_size)
with env.begin(write=True) as txn:
cursor = txn.cursor()
for key, value in cursor:
datum = caffe.proto.caffe_pb2.Datum()
datum.ParseFromString(value)
datum_new = caffe.proto.caffe_pb2.Datum()
datum_new.channels = 3
datum_new.height = size
datum_new.width = size
datum_new.data = datum.data
datum_new.label = 13
cursor.replace(key, datum_new.SerializePartialToString())
【讨论】:
map_size = N env = lmdb.open(lmdb_name, map_size=map_size) with env.begin(write=True) as txn: cursor = txn.cursor() for key, value in cursor: datum = caffe.proto.caffe_pb2.Datum() datum.ParseFromString(value) datum_new = caffe.proto.caffe_pb2.Datum() datum_new.channels = 3 datum_new.height = size datum_new.width = size datum_new.data = datum.data datum_new.label = 13 cursor.replace(key, datum_new.SerializePartialToString())