2016-04-06 3 views
1

Ich habe zwei 60 x 80921 Matrizen, eine mit Daten gefüllt, eine mit Bezug.
Ich möchte die Werte als Schlüssel/Wert-Paare in zwei verschiedenen LMDBs speichern, eine für das Training (sagen wir um die 60000 Spaltenmarke) und eine für das Testen. Hier ist meine Idee; funktioniert es?Erstellen von großen LMDBs für Caffe mit numpy Arrays

X_train = X[:,:60000] 
Y_train = Y[:,:60000] 
X_test = X[:,60000:] 
Y_test = Y[:,60000:] 

X_train = X_train.astype(int) 
X_test = X_test.astype(int) 
Y_train = Y_train.astype(int) 
Y_test = Y_test.astype(int) 

map_size = X_train.nbytes * 10 
env = lmdb.open('sensormatrix_train_lmdb', map_size=map_size) 
with env.begin(write=True) as txn: 
    for i in range(60): 
     for j in range(60000): 
      datum = caffe.proto.caffe_pb2.Datum() 
      datum.height = X_train.shape[0] 
      datum.width = X_train.shape[1] 
      datum.data = X_train[i,j].tobytes() 
      datum.label= int(Y[i,j]) 
      str_id= '{:08}'.format(i) 

Ich bin mir wirklich nicht sicher über den Code. Und worauf bezieht sich die letzte Zeile format(i)?

+0

warum Sie nicht verwenden Eingabe hinzufügen können '„HDF5Data“' Schichten? Sie haben 'h5py' Paket um numpy Arrays als hdf5 Dateien zu speichern. Sehen Sie ein Beispiel [hier] (http://stackoverflow.com/a/34261942/1714410) (das Beispiel verwendet Matlab, um die Daten zu schreiben, aber es ist noch einfacher in Python mit 'h5py'). – Shai

Antwort

0

Es ist nicht 100% klar, was Sie zu tun versuchen: sind Sie jeden Eintrag als separate Datenprobe zu behandeln, oder versuchen Sie 60K 1D Vektoren dim = 60 zu trainieren ...

Angenommen, Sie haben 60K Trainingsproben von dim 60, können Sie die Ausbildung lmdbs wie folgt schreiben:

env_x = lmdb.open('sensormatrix_train_x_lmdb', map_size=map_size) # you can put map_size a little bigger 
env_y = lmdb.open('sensormatrix_train_y_lmdb', map_size=map_size) 
with env_x.begin(write=True) as txn_x, env_y.begin(write=True) as txn_y: 
    for i in xrange(X_train.shape[1]): 
     x = X_train[:,i] 
     y = Y_train[:,i] 

     datum_x = caffe.io.array_to_datum(arr=x.reshape((60,1,1)),label=i) 
     datum_y = caffe.io.array_to_datum(arr=y.reshape((60,1,1)),label=i) 
     keystr = '{:0>10d}'.format(i) # format an lmdb key for this entry 
     txn_x.put(keystr, datum_x.SerializeToString()) # actual write to lmdb 
     txn_y.put(keystr, datum_y.SerializeToString()) 

Jetzt haben Sie zwei LMDB für die Ausbildung, in Ihrem 'prototxt' Sie sollten zwei entsprechende "Data" Schichten haben:

layer { 
    name: "input_x" 
    top: "x" 
    top: "idx_x" 
    type: "Data" 
    data_param { source: "sensormatrix_train_x_lmdb" batch_size: 32 } 
    include { phase: TRAIN } 
} 
layer { 
    name: "input_y" 
    top: "y" 
    top: "idx_y" 
    type: "Data" 
    data_param { source: "sensormatrix_train_y_lmdb" batch_size: 32 } 
    include { phase: TRAIN } 
} 

Um sicherzustellen, dass Sie gelesen haben entsprechende xy Paare Sie eine Plausibilitätsprüfung

layer { 
    name: "sanity" 
    type: "EuclideanLoss" 
    bottom: "idx_x" 
    bottom: "idx_y" 
    top: "sanity" 
    loss_weight: 0 
    propagate_down: false 
    propagate_down: false 
} 
+1

Ich glaube, ich verstehe, was Sie gesagt haben, wie 60% davon. Okay, ich versuche in der Tat, 60k Vektoren zu trainieren (und dann die restlichen 21k Vektoren zum "Testen" zu verwenden ... Nun, ich bin sehr verwirrt über die Details dessen, was du gesagt hast. (Dies ist mein erstes Conv-Netz mit Caffe Lass mich herausfinden, wie ich meine Fragen formulieren soll, und ich melde mich bei dir, vielen Dank, aber ich vermute, die Hauptfrage ist - wie genau bekommen wir unsere X-Vektoren, um sie mit unseren Y-Vektoren zu verbinden? –

+0

@ChristopherTurnbull Bitte schauen Sie in "HDF5Data" '- Ich denke, es wird Ihnen besser in diesem Fall. – Shai

+0

Danke Shai, werde ich tun. –