Javascript 用Keras.js在网站上实现Keras模型

Javascript 用Keras.js在网站上实现Keras模型,javascript,keras,Javascript,Keras,我一直在尝试使用该库将Python生成的基本Keras模型实现到一个网站中。现在,我将模型训练并导出到model.json、model\u weights.buf和model\u metadata.json文件中。现在,我从github页面复制并粘贴了测试代码,以查看模型是否会加载到浏览器中,但不幸的是,我遇到了错误。这是测试代码。(编辑:我修复了一些错误,其余错误请参见下文。) 编辑:所以我对我的程序做了一些改动,使之与JS5兼容(这是我犯的一个愚蠢的错误),现在我遇到了一个不同的错误。此错误

我一直在尝试使用该库将Python生成的基本Keras模型实现到一个网站中。现在,我将模型训练并导出到
model.json
model\u weights.buf
model\u metadata.json
文件中。现在,我从github页面复制并粘贴了测试代码,以查看模型是否会加载到浏览器中,但不幸的是,我遇到了错误。这是测试代码。(编辑:我修复了一些错误,其余错误请参见下文。)


编辑:所以我对我的程序做了一些改动,使之与JS5兼容(这是我犯的一个愚蠢的错误),现在我遇到了一个不同的错误。此错误被捕获,然后被记录。我得到的错误是:
error:predict()必须获取一个对象,其中键是model:input的命名输入。
我认为出现此问题是因为我的
数据
变量的格式不正确。我认为如果我的模型采用28x28的数字数组,那么
数据
也应该是28x28数组,这样它就可以正确地“预测”正确的输出。然而,我相信我遗漏了一些东西,这就是抛出错误的原因。这个问题和我的非常相似,但它是python的,而不是JS的。再次感谢您的帮助

好的,所以我弄明白了为什么会发生这种情况。有两个问题。首先,需要展平
数据
数组,因此我编写了一个快速函数来获取2D输入并将其“展平”为长度为784的1D数组。然后,因为我使用了顺序模型,所以数据的键名不应该是
'input\u 1'
,而应该是
'input'
。这消除了所有的错误


现在,为了获得输出信息,我们只需将其存储在如下数组中:
var out=outputData['output']
。因为我使用了MNIST数据集,
out
是一个长度为10的1D数组,其中包含每个数字为用户写入的数字的概率。从这里,你可以简单地找到概率最高的数字,并将其作为模型的预测。

好的,所以我找到了发生这种情况的原因。有两个问题。首先,需要展平
数据
数组,因此我编写了一个快速函数来获取2D输入并将其“展平”为长度为784的1D数组。然后,因为我使用了顺序模型,所以数据的键名不应该是
'input\u 1'
,而应该是
'input'
。这消除了所有的错误

现在,为了获得输出信息,我们只需将其存储在如下数组中:
var out=outputData['output']
。因为我使用了MNIST数据集,
out
是一个长度为10的1D数组,其中包含每个数字为用户写入的数字的概率。从这里,您可以简单地找到概率最高的数字,并将其用作模型的预测

var model = new KerasJS.Model({
    filepaths: {
        model: 'dist/model.json',
        weights: 'dist/model_weights.buf',
        metadata: 'dist/model_metadata.json'
  },
  gpu: true
});

    model.ready()
  .then(function() {
    console.log("1");
    // input data object keyed by names of the input layers
    // or `input` for Sequential models
    // values are the flattened Float32Array data
    // (input tensor shapes are specified in the model config)
    var inputData = {
      'input_1': new Float32Array(data)
    };
    console.log("2 " + inputData);
    // make predictions
    return model.predict(inputData);
  })
  .then(function(outputData) {
    // outputData is an object keyed by names of the output layers
    // or `output` for Sequential models
    // e.g.,
    // outputData['fc1000']
    console.log("3 " + outputData);
  })
  .catch(function(err) {
    console.log(err);
    // handle error
  });