2015-04-09 15 views
12

Sto cercando di capire come i dati vengono interpretati in Caffe. Per questo ho preso uno sguardo al Minst Tutorial Guardando la definizione dei dati di input:Caffe: Comprensione della struttura lmdb prevista per i BLOB

layers { 
    name: "mnist" 
    type: DATA 
    data_param { 
    source: "mnist_train_lmdb" 
    backend: LMDB 
    batch_size: 64 
    scale: 0.00390625 
    } 
    top: "data" 
    top: "label" 
} 

Ora ho guardato il mnist_train_lmdb e portato una delle voci (mostrato in esadecimale):

0801101C181C229006 
00000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000 
00000000000054B99F973C2400000000000000000000000000000000 
000000000000DEFEFEFEFEF1C6C6C6C6C6C6C6C6AA34000000000000 
00000000000043724872A3E3FEE1FEFEFEFAE5FEFE8C000000000000 
000000000000000000000011420E4343433B15ECFE6A000000000000 
00000000000000000000000000000000000053FDD112000000000000 
000000000000000000000000000000000016E9FF5300000000000000 
000000000000000000000000000000000081FEEE2C00000000000000 
000000000000000000000000000000003BF9FE3E0000000000000000 
0000000000000000000000000000000085FEBB050000000000000000 
00000000000000000000000000000009CDF83A000000000000000000 
0000000000000000000000000000007EFEB600000000000000000000 
00000000000000000000000000004BFBF03900000000000000000000 
0000000000000000000000000013DDFEA60000000000000000000000 
00000000000000000000000003CBFEDB230000000000000000000000 
00000000000000000000000026FEFE4D000000000000000000000000 
00000000000000000000001FE0FE7301000000000000000000000000 
000000000000000000000085FEFE3400000000000000000000000000 
000000000000000000003DF2FEFE3400000000000000000000000000 
0000000000000000000079FEFEDB2800000000000000000000000000 
0000000000000000000079FECF120000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000 
2807 

(ho aggiunto le interruzioni di riga qui per essere in grado di vedere il '7' cifre.)

Ora la mia domanda è, in cui è descritto questo formato? Oppure mettiamo in modo diverso dove viene definito che i primi 36 byte sono una sorta di intestazione e gli ultimi 8 byte hanno una corrispondenza di etichetta?

Come dovrei fare per costruire i miei dati?Blob TutorialLayers Definition danno molto sui formati richiesti. La mia intenzione non è quella di utilizzare i dati dell'immagine, ma le serie temporali

Grazie!

risposta

15

Ho capito che i buffer di protocollo devono entrare in gioco qui. Così ho provato a deserializzarlo rispetto ad alcuni dei tipi definiti in caffe.proto.

Datum sembra essere la misura perfetta:

{Caffe.Datum} 
    Channels: 1 
    Data: {byte[784]} 
    Encoded: false 
    FloatData: Count = 0 
    Height: 28 
    Label: 7 
    Width: 28 

Quindi la risposta è semplice: E 'una rappresentazione serializzata di un 'Datum' digitato esempio come definito per caffe.proto

Btw . poiché inglese non è la mia lingua madre ho dovuto rendersi conto prima che "Datum" è una singolare forma di "dati"

Quando si tratta di utilizzare i propri dati, è strutturato come segue:

Il le dimensioni di blob convenzionali per i dati sono il numero N canale x K x altezza H x larghezza W. La memoria blob è di tipo riga maggiore nel layout, pertanto l'ultima dimensione /rightmost cambia più velocemente. Ad esempio, il valore dell'indice (n, k, h, w) si trova fisicamente all'indice ((n * K + k) * H + h) * W + w.

Vedi Blobs, Layers, and Nets: anatomy of a Caffe model per riferimento

+2

"Datum" = un singolo pezzo di dati - come un caso – Raffael

+0

siete riusciti a creare un file LMDB in un programma C++? Non sono sicuro di aver capito la tua domanda. – user3728501

+0

Stavo usando C# non C++, ma sì dopo aver capito quanto sopra è stato abbastanza semplice collegarlo a LMDB – Sam7

2

posso cercare di rispondere alla tua seconda domanda. Dato che Caffe prende solo i dati in una serie di formati selezionati come lmdb, hdf5 ecc., È meglio convertire (o generare - in caso di dati sintetici) i tuoi dati in questi formati. I seguenti collegamenti possono aiutarti in questo. In caso di problemi con import hdf5 in Python, è possibile fare riferimento alla pagina this.

Creating an LMDB file in Python

Writing an HDF5 file in Python

HDF5 more examples

Problemi correlati