示例#1
0
int main(int argc, char** argv) {
    if (argc != 7){
        cout<<"option: name nData mean0 str0 mean1 str1"<<endl;
        return 0;
    }
    int dim = 2;
    const char* path = argv[1];
    int nData = atoi(argv[2]);
    Dtype mean_0 = atof(argv[3]);
    Dtype str_0 = atof(argv[4]);
    Dtype mean_1 = atof(argv[5]);
    Dtype str_1 = atof(argv[6]);

    // generate data from two 2-d gaussians
    Blob<Dtype>* const blob_data = new Blob<Dtype>(nData, dim, 1, 1);
    caffe_rng_gaussian<Dtype>(nData/2*dim, mean_0, str_0, blob_data->mutable_cpu_data());
    caffe_rng_gaussian<Dtype>(nData/2*dim, mean_1, str_1, blob_data->mutable_cpu_data()+blob_data->offset(nData/2,0,0,0));

    // open leveldb
    leveldb::DB* db;
    leveldb::Options options;
    options.error_if_exists = true;
    options.create_if_missing = true;
    options.write_buffer_size = 268435456;
    leveldb::WriteBatch* batch = NULL;
    leveldb::Status status = leveldb::DB::Open(options, path, &db);
    CHECK(status.ok()) << "Failed to open leveldb " << path
                       << ". Is it already existing?";
    batch = new leveldb::WriteBatch();

    // save to db
    const int kMaxKeyLength = 10;
    char key_cstr[kMaxKeyLength];

    for (int item_id = 0; item_id < nData; ++item_id) {
        Datum datum;
        datum.set_channels(dim);
        datum.set_height(1);
        datum.set_width(1);

        datum.mutable_float_data()->Reserve(dim);
        for(int k=0;k<2;k++){
            datum.add_float_data(blob_data->cpu_data()[blob_data->offset(item_id,k,0,0)]);
        }

        if(item_id < nData/2)  datum.set_label(0);
        else datum.set_label(1);

        snprintf(key_cstr, kMaxKeyLength, "%08d", item_id);
        string keystr(key_cstr);
        batch->Put(keystr, datum.SerializeAsString());
    }

    db->Write(leveldb::WriteOptions(), batch);
    delete batch;
    delete db;

    return 0;
}