2016-04-06 16 views
1

Biri veri içeren bir tane, referansla birlikte iki adet 60 x 80921 matrisim var.
Değerleri anahtar/değer çiftleri olarak iki farklı LMDB'de saklamak istiyorum, bunlardan biri antrenman için (60000 sütun işaretini dilimleyeceğim) ve bir tanesi test için. İşte benim fikrim; çalışıyor mu?Sayısal dizilerle Caffe için büyük LMDB'ler oluşturma

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) 

Gerçekten bu koddan emin değilim. Ve son satır format(i) neye yarar?

+0

neden ' "HDF5Data"' girdi katmanları kullanmayan Sağlık denetimi ekleyebilir olmak için mi? nump dizilerini hdf5 veri dosyaları olarak saklamak için 'h5py' paketiniz var. Bir örneğe bakın [burada] (http://stackoverflow.com/a/34261942/1714410) (örnek, verileri yazmak için matlab kullanır, ancak python'da 'h5py' kullanarak daha da basittir). – Shai

cevap

0

Size yapmaya çalışıyorsun ne değildir% 100 açıktır:

sizi varsayarsak ... Eğer ayrı bir veri örneği olarak her girişi tedavi olabilirsiniz ya da loş = 60 60K 1D vektörleri üzerinde eğitmek için çalışıyoruz loş 60 60K eğitim örnekleri var, böyle eğitim lmdbs yazabilirsiniz:

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()) 

Artık 'prototxt' Eğer olması gereken iki tekabül "Data" katmanlarında, eğitim için iki lmdb vardır:

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 } 
} 

emin xy çiftleri karşılık gelen okuma, sen

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

Sanırım ne dediğini anlıyorum,% 60 gibi. Tamam, ben gerçekten 60k vektörleri (ve sonra 'test' için kalan 21k vektörleri kullanarak ...) eğitmeye çalışıyorum. Şimdi, ne söylediğinin ayrıntılarıyla ilgili çok şaşkınım. (Bu benim caffe kullanarak ilk kıvrım ağım. Sorularımın nasıl ifade edileceğini ve bana geri döneceğimi söyleyeyim.Çok teşekkürler ... Ama asıl soru şu ki, X vektörlerimizi Y vektörlerimizle eşleştirmek için tam olarak nasıl alıyoruz? –

+0

@ChristopherTurnbull lütfen "HDF5Data" 'ya bakın - bu durumda size daha iyi geleceğini düşünüyorum – Shai

+0

Teşekkürler Shai, yapacağım. –

İlgili konular