0

lmdb データベースがあり、その内容を読み取ろうとしています。皮肉なことに、画面には何も表示されません。これは、lmdb から読み取るために作成したコード スニペットです。

import caffe
import lmdb
import numpy as np
from caffe.proto import caffe_pb2
import cv2
import sys

db_train = lmdb.open('mnist_train_lmdb')
db_train_txn = db_train.begin()
cursor = db_train_txn.cursor()

print db_train
print db_train_txn
print db_train_txn.cursor()

datum = caffe_pb2.Datum()

index = sys.argv[0]
size_train = 50000
size_test = 10000
data_train = np.zeros((size_train, 1, 28, 28))
label_train = np.zeros(size_train, dtype=int)

print 'Reading training data...'
i = -1
for key, value in cursor:
    i = i + 1
    if i % 1000 == 0:
        print i
    if i == size_train:
        break
    datum.ParseFromString(value)
    label = datum.label
    data = caffe.io.datum_to_array(datum)
    data_train[i] = data
    label_train[i] = label

これは次を出力します:

<Environment object at 0x0000000009CE3990>
<Transaction object at 0x0000000009CE1810>
<Cursor object at 0x0000000009863738>
Reading training data...
Reading test data...

for ループがまったく実行されていないようです。ここで何が欠けていますか?

私が確認したところ、これが lmdb から読み取る通常の方法のようです。私が見たすべてのソース例は同様のアプローチを持っています。

4

2 に答える 2

1

OK、データベースに障害があったようです! 別のデータベースを使用しましたが、問題なく動作しました。私のコードスニペットと@DaleSongによって提案されたものの両方。

于 2016-10-20T05:32:05.217 に答える
1

自分自身を修正してください:

どちらの使い方もlmdb.Cursor()

for key, value in cursor:

while cursor.next():

は正しく、元の回答では間違っていました。


適切に使用しなかったためcursor、コードを次のようにわずかに変更する必要があります。

... # original stuff
print 'Reading training data...'
i = -1
while cursor.next(): #  Move to the next element, and
    i = i + 1        #  note cursor starts in an unpositioned state
    if i % 1000 == 0:
        print i
    if i == size_train:
        break
    datum.ParseFromString(cursor.value())
    label = datum.label
    data = caffe.io.datum_to_array(datum)
    data_train[i] = data
    label_train[i] = label

lmdb Python バインディングの使用方法については、こちらを参照してください。

于 2016-10-20T01:26:44.113 に答える