0

尝试使用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 基于字符串输入对模型进行分类?如果是这样,怎么做?

4

0 回答 0