首页 > 解决方案 > 如何将角度数据转换为正确的张量格式?

问题描述

我正在做一个机器学习项目,我正在尝试用 angular 部署我的算法。我已经正确上传了预训练模型,并且我设法从 csv 上传数据,但现在我无法正确地将我拥有的数据转换为正确的张量格式。我的模型是一个 LSTM 神经网络,它期望时间窗长度为 60 的加速度计数据(x 轴、y 轴和 z 轴)来预测人类活动,因此格式为 [any, 60,3] 的张量在您下方可以找到我目前拥有的代码的重要部分

在此处加载模型

async loadModel() {
   this.model = await tf.loadLayersModel('assets/tfjs_model/model.json');
 };

现在我有一个带有 tf.ones() 函数的占位符来简单地测试我的预测是否有效(它确实有效!!)

 async predictProcess() {
   const output = this.model.predict([tf.ones([10, 60, 3])]) as any;    
   this.predictions = Array.from(output.dataSync());
   console.log(this.predictions);

};

这是代码的一部分,我在其中加载数据

getDataRecordsArrayFromCSVFile(csvRecordsArray: any, headerLength: any) {
let dataArr = [];

for (let i = 0; i < csvRecordsArray.length; i++) {
  let data = (<string>csvRecordsArray[i]).split(',');

  // FOR EACH ROW IN CSV FILE IF THE NUMBER OF COLUMNS
  // ARE SAME AS NUMBER OF HEADER COLUMNS THEN PARSE THE DATA
  if (data.length == headerLength) {

    let csvRecord: CSVRecord = new CSVRecord();

  //  csvRecord.timestep = Number(data[0].trim());
    csvRecord.xAxis = Number(data[1].trim());
    csvRecord.yAxis = Number(data[2].trim());
    csvRecord.zAxis = Number(data[3].trim());

    dataArr.push(csvRecord);
  }
}
return dataArr;
}

这是 CSVRecord 类

export class CSVRecord {
  public timestep: any;
  public xAxis: any;
  public yAxis: any;
  public zAxis: any;
}

标签: javascriptangulartypescripttensorflow.js

解决方案


与其创建要填充的对象dataArr,不如使用数组

if (data.length == headerLength) {

    let csvRecord: number[] = [];

  //  csvRecord.timestep = Number(data[0].trim());
    csvRecord.push(Number(data[1].trim()));
    csvRecord.push(Number(data[2].trim()));
    csvRecord.push(Number(data[3].trim()));

    dataArr.push(csvRecord);
  }

然后创建一个张量 out dataArr,你可以使用

tf.tensor(dataArr)

使用tf.tensor,它将创建一个形状的张量[dataArr.length, 3]

但是如果dataArr是一个大数组,尝试直接创建它的张量会导致内存问题,因为在计算过程中开始使用时,整个数据将直接上传到张量后端。这个答案讨论了在创建张量时如何处理大数据。


推荐阅读