Tensorflow错误:构造形状的张量(120800)应该与值的长度(121881)相匹配

时间:2018-07-06 15:09:30

标签: javascript tensorflow p5.js

我是机器新手,还是Tensorflow新手。作为一种学习方法,我一直与Coding Train的Dan Shiffman一起学习,他展示了如何创建颜色分类器。

但是,我想做些不同的事情,所以我收集了手绘形状的数据。每个形状都有一个标签(正方形,圆形或三角形),还具有400个像素的阵列(每个图片均以20x20的网格绘制)。数据存储在一个对象中,该对象包含在JSON文件中。

使用p5.js的“ loadJSON”功能,我可以访问JSON文件,迭代条目并创建两个数组:“形状”(是像素数组的数组)和“标签”(是相应标签的数组。

下面是使用p5的“ preload”和“ setup”功能的代码。

let data;

let model;

// list of labels from which you can get the oneHot index
let labelList = [
  "square",
  "circle",
  "triangle"
];

// function that is ran before setup
function preload() {
  data = loadJSON('shapeData.json'); // loads the json file
}

// called after preload
function setup() {

  let shapes = []; // an array of the pixels of hand-drawn shapes
  let labels = []; // the corresponding label of each hand-drawn shape
  
  // iterates over all of the entries in data
  for (let record of data.entries) {
    let pixels = record.pixels;
    shapes.push(pixels);
    labels.push(labelList.indexOf(record.label));
  }

  // ---------------- ERROR ------------------------ 
  let xs = tf.tensor2d(shapes);
  
  
  
  // these tensors work great
  let labelsTensor = tf.tensor1d(labels, 'int32');

  let ys = tf.oneHot(labelsTensor, 3);

}

当我尝试将'xs'创建为张量2d时出现问题。

我得到了错误:

Error: Constructing tensor of shape (120800) should match the length of values (121881)
    at assert (tfjs@0.11.7:2)
    at new e (tfjs@0.11.7:2)
    at Function.e.make (tfjs@0.11.7:2)
    at Function.e.tensor (tfjs@0.11.7:2)
    at Object.e.tensor2d (tfjs@0.11.7:2)
    at setup (sketch.js:27)
    at p5.<anonymous> (p5.js:46551)
    at _runIfPreloadsAreDone (p5.js:46499)
    at p5._decrementPreload (p5.js:46509)
    at p5.js:59586

我总共有302个数据点,每个数据点都是400个二进制数的数组。因此,张量的形状应为[302,400],并且当我将形状更改为错误的东西(例如[303,401])时,会出现错误,指出应为[302,400]。

我是整个过程的新手,因此将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

我找到了解决方法!下载数据的单独脚本出错。这样创建了不同长度的数据...

例如,一种形状具有400像素,另一种形状具有410像素。这种差异在张量流中产生了一个问题。删除没有400像素的数据点后,程序运行正常!