本教程为了那些第一次使用caffe框架进行深度学习训练的人而生的,我来一个简单关于caffe训练数据的组织来个简单的介绍。我们都知道caffe中使用leveldb
和lmd两种方式进行组织数据。这里介绍一种使用lmd进行训练数据组织的方式。
我来贴一段简单的代码
组织数据。
1. lmd的打开和写入数据
定义环境lmd的环境
MDB_env *mdb_env;
MDB_dbi mdb_dbi;
MDB_val mdb_key, mdb_data;
MDB_txn *mdb_txn;
打开数据库
CHECK_EQ(mdb_env_create(&mdb_env),MDB_SUCCESS) << "mdb_env_create failed";
CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS) // 1TB
<< "mdb_env_set_mapsize failed";
CHECK_EQ(mdb_env_open(mdb_env, argv[3], 0, 0664), MDB_SUCCESS)
<< "mdb_env_open failed";
CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS)
<< "mdb_txn_begin failed";
CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS)
<< "mdb_open failed";
写入具体的数据
mdb_data.mv_size = value.size();
mdb_data.mv_data = reinterpret_cast<void*>(&value[0]);
mdb_key.mv_size = keystr.size();
mdb_key.mv_data = reinterpret_cast<void*>(&keystr[0]);
CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0),MDB_SUCCESS)
CHECK_EQ这个东西是我自己定义的一个断言宏,嘿嘿。懒得贴出来了,大家可以自己编写自己的断言宏。
value和key均为两个string。嘿嘿。是不是觉得非常简单,引用头文件是
#include <glog/logging.h>
#include <leveldb/db.h>
#include <leveldb/write_batch.h>
#include <lmdb.h>
#include <sys/stat.h>
#include <algorithm>
#include <fstream> // NOLINT(readability/streams)
#include <string>
#include <utility>
#include <vector>
#include "caffe.pb.h"
#include "io.hpp"
#include "rng.hpp"
好了,到此为止大家应该知道怎么组织自己的训练数据了。提示一点,caffe的训练数据的东西都需要进行resize成同一维度的数据。