尝试使用ml5js对机器学习模型进行分类时,会出现以下错误:
Error when checking : expected dense_Dense1_input to have shape [null,90] but got array with shape [1,1].
我得出的结论是,这可能是由于我的输入是一个大字符串(显然只允许数字?)。
把它放在上下文中,我特别想做的是“理解”代表游戏关卡数据的文件中的变化。为了训练模型,我将更改分为 3 个标签(“几何”、“粒子”和“光”),并将它们分别保存到各种各样的对象中。简而言之,每个标签后面都有一个字符串(“原始”),它具有它所代表的变化。
json 数据如下所示:
let disorganizedData = [
{"raw": "1000000a8060000020600736b79626f7814", "changes": "geometry"},
{"raw": "3f000200002002000020020000200200002", "changes": "particle"},
{"raw": "00001010001000100010001000100010100", "changes": "light"}
];
(请注意,“原始”还有数百个字符,出于可读性原因,我在此处省略了它,并且要正确测试它,您需要真实数据并且其中超过 3 个)。
我的函数看起来像这样(不要一次运行它们):
组织和保存数据
let options = {
inputs: ["raw"],
outputs: ["changes"],
task: "classification",
debug: "true"
};
let model = ml5.neuralNetwork(options);
function organizeData(data) {
data.forEach(level => {
model.addData({"level": level.raw}, {"label": level.changes});
})
model.saveData("data"); // writes "data.json"
};
organizeData(disorganizedData);
训练和保存模型
function trainModel() {
model.loadData("data.json", ()=>{
model.normalizeData();
model.train({
epochs: 200
}, (epoch)=>{
console.log("training", epoch);
}, ()=>{
console.log("done");
model.save(); // writes "model.json", "model_meta.json" and "model.weights.bin"
})
});
};
trainModel();
根据训练好的模型对从未见过的数据进行分类
let rawDataSample = "101000100010001000100010001010001000";
function predictChanges() {
model.load({
model: "model.json",
metadata: "model_meta.json",
weights: "model.weights.bin"
}, () => {
console.log("model loaded");
model.classify({"raw": rawDataSample}, (err, result) => {
if (err) throw err;
console.log("The change this level received is:", result);
})
})
}
predictChanges();
正如我之前提到的,忽略我输入的用于训练和测试模型的随机“原始”数据,真实数据更简洁(而且庞大)。
是否可以使用 ml5.js 基于字符串输入对模型进行分类?如果是这样,怎么做?