本教程为了那些第一次使用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成同一维度的数据。
我们什么都没有,唯一的本钱就是青春。