2016-04-13 9 views
1

Ich möchte eine lmdb-Daten in Python erstellen, wo die Labels keine Skalare aber jede Bezeichnung ist (1, K) Vektor und K ist die Anzahl der Klassen. Insbesondere weist das Etikett Vektor überall Nullen außer in dem entsprechenden Klassenindex Sie haben 1.Labels als eine Matrix in LMDB-Daten mit Python

ich den folgenden Code in Python getestet:

with env.begin(write=True) as txn: 
    for i in range(N): 
     datum = caffe.proto.caffe_pb2.Datum() 
     datum.channels = X.shape[1] 
     datum.height = X.shape[2] 
     datum.width = X.shape[3] 
     datum.data = X[i].tobytes() # or .tostring() if numpy < 1.9 
     datum.label = int(y[i]) 
     str_id = '{:08}'.format(i) 
     txn.put(str_id.encode('ascii'), datum.SerializeToString()) 
     print i+1 

Aber ich TypeError: only length-1 arrays can be converted to Python scalars die diesen Fehler kam, wo y[i] ein numpy ist (1, k) Vektor wie oben beschrieben.

Ich frage mich auch, ob Caffe solche Format von Etiketten akzeptieren würde.

Jede Hilfe wäre sehr

Antwort

1

Ja klar, caffe Transformation von numpy Arrays Bezug unterstützt, dann können Sie das Datum auf LMDB setzen.

Verwenden Sie caffe.io.array_to_datum(numpy_array), um ein numpy_array in ein Datum umzuwandeln. Beachten Sie, dass das numpy_array 4 Achsen haben muss. Wenn Sie also ein vectortor in lmdb setzen möchten, sollten Sie ein numpy_array mit shape [1,1,1, M] initialisieren. während M die Länge deines Vektors ist.

here ist ein Werkzeug, um Bild/Map-Paare zu lmdb zu schreiben, die in Caffe-Netzwerke eingespeist werden können.