caffe 实践程序3——caffe提取特征以及由模型test数据

本文介绍了一个用于将CIFAR100数据集转换为Caffe可用的LevelDB格式的C++程序。该程序读取原始数据文件,并使用LevelDB存储转换后的数据,以便于后续进行分类任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 cifar100目录下  //提取conv3的特征

../../build/tools/extract_features.bin cifar10_quick_iter_16000 cifar100_quick_train.prototxt ip1 yjyfeature 500 CPU 0
../../build/tools/extract_features.bin cifar10_quick_iter_16000 cifar100_quick_train.prototxt conv3 yjyfeature 500 CPU 0

已经训练出模型,现在test cifar100

TOOLS=../../build/tools
GLOG_logtostderr=1 $TOOLS/test_net.bin cifar100_quick_test.prototxt cifar10_quick_iter_16000 4000 CPU



convert_cifar_datayjy.cpp

// Copyright 2014 BVLC and contributors.
//
// This script converts the CIFAR dataset to the leveldb format used
// by caffe to perform classification.
// Usage:
//    convert_cifar_data input_folder output_db_file
// The CIFAR dataset could be downloaded at
//    http://www.cs.toronto.edu/~kriz/cifar.html

#include <google/protobuf/text_format.h>
#include <glog/logging.h>
#include <leveldb/db.h>

#include <stdint.h>
#include <fstream>  // NOLINT(readability/streams)
#include <string>

#include "caffe/proto/caffe.pb.h"

using std::string;

const int kCIFARSize = 32;
const int kCIFARImageNBytes = 3072;
const int kCIFARBatchSize = 50000;
const int kCIFARTrainBatches = 1;

void read_image(std::ifstream* file, int* label, char* buffer) {
  char label_char,label_char1;
  file->read(&label_char1, 1);//20的标签
  file->read(&label_char, 1);//100 的标签
  *label = label_char;
  file->read(buffer, kCIFARImageNBytes);
  //std::ofstream out("try.txt",std::ios::app);
  //int aa=*label;
 // out<<aa<<"\n";
  return;
}


void convert_dataset(const string& input_folder, const string& output_folder) {
  // Leveldb options
  leveldb::Options options;
  options.create_if_missing = true;
  options.error_if_exists = true;
  // Data buffer
  int label,labelyjy,label_test;
  char str_buffer[kCIFARImageNBytes];
  string value;
  caffe::Datum datum;
  datum.set_channels(3);
  datum.set_height(kCIFARSize);
  datum.set_width(kCIFARSize);

  LOG(INFO) << "Writing Training data";
  leveldb::DB* train_db;
  leveldb::Status status;
  status = leveldb::DB::Open(options, output_folder + "/cifar-train-leveldb",
      &train_db);
  CHECK(status.ok()) << "Failed to open leveldb.";
  for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) {
    // Open files
    LOG(INFO) << "Training Batch " << fileid + 1;
    snprintf(str_buffer, kCIFARImageNBytes, "/train.bin");
    std::ifstream data_file((input_folder + str_buffer).c_str(),
        std::ios::in | std::ios::binary);

    
     std::ifstream labeltrain_file("map_100.txt",std::ios::in);//训练样本的标签

    CHECK(data_file) << "Unable to open train file #" << fileid + 1;
    std::ofstream out("new_label.txt",std::ios::app);///////////////////测试输出
    for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {
      read_image(&data_file, &label, str_buffer);
      labeltrain_file>>labelyjy;
      datum.set_label(labelyjy);
      out<<labelyjy<<"\n";
      datum.set_data(str_buffer, kCIFARImageNBytes);
      datum.SerializeToString(&value);
      snprintf(str_buffer, kCIFARImageNBytes, "%05d",
          fileid * kCIFARBatchSize + itemid);
      train_db->Put(leveldb::WriteOptions(), string(str_buffer), value);
    }
  }

  LOG(INFO) << "Writing Testing data";
  leveldb::DB* test_db;
  CHECK(leveldb::DB::Open(options, output_folder + "/cifar-test-leveldb",
      &test_db).ok()) << "Failed to open leveldb.";
  // Open files
  std::ifstream data_file((input_folder + "/test.bin").c_str(),
      std::ios::in | std::ios::binary);
  CHECK(data_file) << "Unable to open test file.";

std::ifstream labelfile_test("new_100_test.txt",std::ios::in);//测试样本的标签
    std::ofstream out1("new_label1.txt",std::ios::app);///////////////////测试输出
  for (int itemid = 0; itemid < 10000; ++itemid) {
    read_image(&data_file, &label, str_buffer);
    labelfile_test>>label_test;
    datum.set_label(label_test);
    out1<<label_test<<"\n";
    datum.set_data(str_buffer, kCIFARImageNBytes);
    datum.SerializeToString(&value);
    snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid);
    test_db->Put(leveldb::WriteOptions(), string(str_buffer), value);
  }
  delete train_db;
  delete test_db;
}

int main(int argc, char** argv) {
  if (argc != 3) {
    printf("This script converts the CIFAR dataset to the leveldb format used\n"
           "by caffe to perform classification.\n"
           "Usage:\n"
           "    convert_cifar_data input_folder output_folder\n"
           "Where the input folder should contain the binary batch files.\n"
           "The CIFAR dataset could be downloaded at\n"
           "    http://www.cs.toronto.edu/~kriz/cifar.html\n"
           "You should gunzip them after downloading.\n");
  } else {
    google::InitGoogleLogging(argv[0]);
    convert_dataset(string(argv[1]), string(argv[2]));
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值