Javascript ML5:错误:您正在使用loss';传递形状为11342,1的目标数组;分类交叉熵';范畴交叉熵&x27;预期目标

Javascript ML5:错误:您正在使用loss';传递形状为11342,1的目标数组;分类交叉熵';范畴交叉熵&x27;预期目标,javascript,tensorflow,Javascript,Tensorflow,我正在尝试在我正在构建的React应用程序中使用ML5库进行分类 我的浏览器中出现以下错误 错误:您正在传递形状为11342,1的目标数组,同时使用丢失的“分类交叉熵”“分类交叉熵”期望目标是形状[样本,类]的二元矩阵(1和0)。 在出现此错误的几个Github问题中,解释是此错误表示数据集中只有1种类型的对象。数据集中必须有2个或更多不同的对象类。这是链接和中的说明 我不知道这是什么意思。我的数据中有6个输入和2个输出。我的输入将如下所示 let inputs = { male: 1,

我正在尝试在我正在构建的React应用程序中使用ML5库进行分类

我的浏览器中出现以下错误

错误:您正在传递形状为11342,1的目标数组,同时使用丢失的“分类交叉熵”“分类交叉熵”期望目标是形状[样本,类]的二元矩阵(1和0)。

在出现此错误的几个Github问题中,解释是
此错误表示数据集中只有1种类型的对象。数据集中必须有2个或更多不同的对象类。
这是链接和中的说明

我不知道这是什么意思。我的数据中有6个输入和2个输出。我的输入将如下所示

let inputs = {
  male: 1,
  female: 0,
  dob: 641710800000,
  // have more, but keeping it simple for this example...
}
let output = {
  job: 1 // or 0, if they have a job or not, for example. i.e., two possible outputs
}
我的输出会像这样

let inputs = {
  male: 1,
  female: 0,
  dob: 641710800000,
  // have more, but keeping it simple for this example...
}
let output = {
  job: 1 // or 0, if they have a job or not, for example. i.e., two possible outputs
}
然而,我仍然得到了错误。有人能帮我理解为什么以及如何修复它吗

下面是我的代码:

people_arr = json.voters_arr;
keys = ["male", "female", "dob"];

let model_options = {
  inputs: keys,
  outputs: ["job"],
  task: "classification"
};

let model = ml5.neuralNetwork(model_options);


for (let person of people_arr) {
  let inputs = {
    male: person.male,
    female: person.female,
    dob: person.dob
  };

  let output = {};
  output.job = person.job; // either 0 or 1
  model.addData(inputs, output);
}

model.normalizeData();

let train_options = { epochs: 100 }
model.train(train_options, whileTraining); // <-- error happening here
.then(() => {
  console.log("pre classify");
  return model.classify(new_person_arr);
})
.then((err, results) => {
  if (err) { console.log("error") }

  else {
    let new_arr = results.splice(100);
    console.log("results : ", new_arr);
    setValues({...values, results: new_arr })
  }
})
.catch((err) => { console.log("err : ", err) });

people\u arr=json.voctors\u arr;
键=[“男性”、“女性”、“dob”];
让模型_选项={
输入:键,
输出:[“作业”],
任务:“分类”
};
让model=ml5.神经网络(model_选项);
为(让人中的人参与){
让输入={
男:人,男,,
女:人,女,,
dob:person.dob
};
让输出={};
output.job=person.job;//0或1
模型。添加数据(输入、输出);
}
model.normalizeData();
让我们训练选项={epochs:100}
型号.列车(列车选项,同时培训);//{
控制台日志(“预分类”);
返回模型。分类(新用户);
})
.然后((错误,结果)=>{
if(err){console.log(“error”)}
否则{
设new_arr=结果。拼接(100);
日志(“结果:”,新的_arr);
setValues({…值,结果:new_arr})
}
})
.catch((err)=>{console.log(“err:,err)});

分类交叉熵
期望一个热向量作为标签,而不是一个数字。例如,假设有三个人:
Michael
Jim
,和
Dwight
Michael
Jim
有工作,
Dwight
没有工作。比如说,没有工作会把你归入
0
,而有工作会把你归入
1
。本例中的标签如下所示:

[[0,1],    # Michael's label
 [0,1],    # Jim's label
 [1,0]]    # Dwight's label
Michael
Jim
属于
1
类别,因此他们在索引
1
处有一个
1
,在所有其他索引处有一个
0
Dwight
属于
0
类别,因此他在索引
0
中有一个
1
,在所有其他索引中有一个
0


如果要使用单个数字作为标签(即
0
1
),则应使用
稀疏分类交叉熵
<代码>稀疏分类交叉熵将整数作为每个样本的标签,并假设存在从
0
到它看到的最大值整数的类别。因此,它可以很好地处理您已经拥有的信息。

分类交叉熵
需要一个热向量作为标签,而不是一个数字。例如,假设有三个人:
Michael
Jim
,和
Dwight
Michael
Jim
有工作,
Dwight
没有工作。比如说,没有工作会把你归入
0
,而有工作会把你归入
1
。本例中的标签如下所示:

[[0,1],    # Michael's label
 [0,1],    # Jim's label
 [1,0]]    # Dwight's label
Michael
Jim
属于
1
类别,因此他们在索引
1
处有一个
1
,在所有其他索引处有一个
0
Dwight
属于
0
类别,因此他在索引
0
中有一个
1
,在所有其他索引中有一个
0


如果要使用单个数字作为标签(即
0
1
),则应使用
稀疏分类交叉熵
<代码>稀疏分类交叉熵将整数作为每个样本的标签,并假设存在从
0
到它看到的最大值整数的类别。因此,它将与您已经拥有的功能完美配合。

@Scott是否应该在您的代码中的其他地方存在新的\u person\u arr?因为它唯一被引用的地方就是那一行。是的,它是一个实际的对象或数组。我在调用
.classify()
之前输入了
console.log
内容,它不是
null
未定义的
@Scott,我不确定。试着发布另一个问题,也许其他人可以帮助你。@Scott是
新的\u person\u arr
应该存在于你的代码中的其他地方吗?因为它唯一被引用的地方就是那一行。是的,它是一个实际的对象或数组。我在调用
.classify()
之前输入了
console.log
内容,它不是
null
未定义的
@Scott,我不确定。试着发另一个问题,也许其他人可以帮你。