从零构建深度学习推理框架-2 从CSV文件初始化Tensor

CSV格式

概念

CSV(逗号分隔值)文件是一种特殊的文件类型,可在 Excel 中创建或编辑。CSV文件采用逗号分隔的形式来存储文本和数字信息,总体来说,这种形式的文件格式具有扩展性好,移植性强的特点。

目前许多主流程序采用CSV文件作为数据导入导出的中间格式,例如MySQL数据库可以从CSV文件中导入数据,GMail联系人可以导出到CSV文件,然后将其导入到Outlook中。

pytorch和KuiperInfer中间数据对比文件,用于读取Pytorch复杂,且多变维度的输出,来对比我们的推理结果。

从pytorch输出(被定位到csv文件)中读取,KuiperInfer读取,然后再对比.

过程是这样的:

pytorch读取权重文件--》infer--》numpy--》再保存到本地,格式为csv -->读取并初始化 tensor

kuiper 读取权重文件-->保存为tensor -->

绿色背景就是我们今天要去做的。

代码:

其实这个也不会很难:

cpp 复制代码
std::shared_ptr<Tensor<float >> CSVDataLoader::LoadData(const std::string &file_path, char split_char) {
  CHECK(!file_path.empty()) << "File path is empty!";
  std::ifstream in(file_path);
  CHECK(in.is_open() && in.good()) << "File open failed! " << file_path;

  std::string line_str;
  std::stringstream line_stream;

  const auto &[rows, cols] = CSVDataLoader::GetMatrixSize(in, split_char);
  std::shared_ptr<Tensor<float>> input_tensor = std::make_shared<Tensor<float>>(1, rows, cols);
  arma::fmat &data = input_tensor->at(0);

  size_t row = 0;
  while (in.good()) {
    std::getline(in, line_str);
    if (line_str.empty()) {
      break;
    }

    std::string token;
    line_stream.clear();
    line_stream.str(line_str);

    size_t col = 0;
    while (line_stream.good()) {
      std::getline(line_stream, token, split_char);
      try {
        data.at(row, col) = std::stof(token);
      }
      catch (std::exception &e) {
        LOG(ERROR) << "Parse CSV File meet error: " << e.what();
        continue;
      }
      col += 1;
      CHECK(col <= cols) << "There are excessive elements on the column";
    }

    row += 1;
    CHECK(row <= rows) << "There are excessive elements on the row";
  }
  return input_tensor;
}

核心区段:

cpp 复制代码
  const auto &[rows, cols] = CSVDataLoader::GetMatrixSize(in, split_char);
  std::shared_ptr<Tensor<float>> input_tensor = std::make_shared<Tensor<float>>(1, rows, cols);
  arma::fmat &data = input_tensor->at(0);

确认rows和cols,创建空tensor

cpp 复制代码
while (line_stream.good()) {
      std::getline(line_stream, token, split_char);
      try {
        data.at(row, col) = std::stof(token);
      }
      catch (std::exception &e) {
        LOG(ERROR) << "Parse CSV File meet error: " << e.what();
        continue;
      }
      col += 1;
      CHECK(col <= cols) << "There are excessive elements on the column";
    }

    row += 1;
    CHECK(row <= rows) << "There are excessive elements on the row";
  }
  return input_tensor;

迭代,读进来赋值,返回Tensor

这里唯一需要注意的就是有表头的情况:

cpp 复制代码
try {
        //todo 补充
        // 能够读取到第一行的csv列名,并存放在headers中
        // 能够读取到第二行之后的csv数据,并相应放置在data变量的row,col位置中
        
        if (row == 0)
        {
                  headers.push_back(token);
        }
        else{
        data.at(row-1, col) = std::stof(token);
        }
      }

在try中要先将表头传到header里,再将其余的数组读到data中,但记住data中的row要-1,因为要扣除表头的一行。

相关推荐
ZhouDevin4 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
船厂电气自动化ai大模型5 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
Jialu.6 小时前
从 102M 到 34M:BERT 到 BiLSTM 的完整知识蒸馏实现
深度学习·nlp·bert
YOLO数据集集合7 小时前
排球动作识别数据集 | 排球动作 体育分析 动作识别9041期
深度学习·数据集·动作识别·排球动作识别·运动动作识别·体育分析·排球动作
Mid_search7 小时前
高估问题、Target Network、Double DQN
人工智能·深度学习·强化学习·double dqn·bootstrapping·target network
YOLO数据集集合8 小时前
隧道病害检测数据集 | 隧道检测 裂缝识别 渗水监测 剥落检测9037期
人工智能·深度学习·yolo·隧道·裂缝检测·裂缝识别·隧道病害
张继雁9 小时前
不同类型磨削液使用安全注意事项
人工智能·深度学习·安全·业界资讯·远程工作·空间计算
小王20411 小时前
Day 32:DeepLab系列与语义分割进阶
深度学习·神经网络·计算机视觉
Magic-ZYJ11 小时前
HarmonyOS 文件选择与读写:DocumentViewPicker、URI、沙箱目录一次搞清
深度学习·华为·harmonyos
力学与人工智能11 小时前
智能流体力学专题研讨会特邀报告3|边鑫:混合深度学习与迭代方法的粘性不可压流动加速求解
人工智能·深度学习·流体力学·ppt分享