【问题标题】:Creating large LMDBs for Caffe with numpy arrays使用 numpy 数组为 Caffe 创建大型 LMDB
【发布时间】:2016-07-26 15:24:43
【问题描述】:

我有两个 60 x 80921 矩阵,一个充满数据,一个带有参考。
我想将值作为键/值对存储在两个不同的 LMDB 中,一个用于训练(比如我将在 60000 列标记附近切片),另一个用于测试。这是我的想法;有用吗?

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)

我真的不确定代码。最后一行format(i) 指的是什么?

【问题讨论】:

  • 你为什么不使用"HDF5Data"输入层?你有 h5py 包将 numpy 数组存储为 hdf5 数据文件。看一个例子here(例子使用matlab写数据,但是在python中使用h5py就更简单了)。

标签: python numpy deep-learning caffe lmdb


【解决方案1】:

目前还不是 100% 清楚您要做什么:您是将每个条目视为单独的数据样本,还是尝试在 dim=60 的 60K 1D 向量上进行训练...

假设你有 60K 的 dim 60 的训练样本,你可以这样写训练 lmdbs:

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

现在你有两个用于训练的 lmdb,在你的 'prototxt' 中你应该有两个对应的 "Data" 层:

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

为确保您阅读了相应的 x y 对,您可以添加健全性检查

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

【讨论】:

  • 我想我明白你说的,大概60%。好的,我确实在尝试训练 60k 向量(然后使用剩余的 21k 向量进行“测试”......现在,我对你所说的细节感到非常困惑。(这是我第一个使用 caffe 的卷积网络) ,哇哦!让我弄清楚如何准确表达我的问题,然后我会回复你。非常感谢。但我想主要问题是——我们如何让 X 向量与 Y 向量匹配?
  • @ChristopherTurnbull 请查看"HDF5Data" - 我认为在这种情况下它会更适合你。
  • 谢谢Shai,我会的。
  • 另外,你能解释一下这个错误吗? ---> 12 env_x.put(keystr, datum_x.SerializeToString() ) # 实际 AttributeError: 'Environment' 对象没有属性 'put'
  • @ChristopherTurnbull 我的错。请查看正确答案。
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2016-01-12
  • 2016-01-15
  • 1970-01-01
相关资源
最近更新 更多