我正在尝试使用ML5库在正在构建的React应用中进行分类。
我的浏览器出现以下错误
Error: You are passing a target array of shape 11342,1 while using a loss 'categorical_crossentropy'. 'categorical_crossentropy'expects targets to be binary matrices (1s and 0s) of shape [samples, classes].
在引发该错误的多个Github问题中,解释是That error indicates you have just 1 type of objects in your dataset. You must have 2 or more different object classes in your dataset.
是链接here和here中的解释。
我不知道这意味着什么。我的数据中有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
}
但是,我仍然遇到错误。有人可以帮助我了解为什么以及如何解决此问题吗?
下面是我的代码:
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) });
答案 0 :(得分:2)
Categorical cross-entropy
期望一个热向量作为标签,而不是单个数字。例如,假设有三个人: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
中,因此他在索引1
处有0
,在所有其他索引处都有0
。
如果要使用单个数字作为标签(即0
或1
),则应改用sparse categorical cross-entropy
。 Sparse categorical cross-entropy
将整数作为每个样本的标签,并假定存在从0
到它看到的最高值整数的类别。因此,它将与您已有的设备完美配合。