Я пытаюсь реализовать базовую модель Keras, сгенерированную на Python, на веб-сайт, используя библиотеку Keras.js. Теперь у меня есть модель, обученная и экспортированная в model.json
, model_weights.buf
и model_metadata.json
. Теперь я по существу скопировал и вставил тестовый код с страницы github, чтобы посмотреть, будет ли модель загружаться в браузере, но, к сожалению, я получаю ошибки. Вот тестовый код. (EDIT: я исправил некоторые ошибки, см. Ниже для остальных).
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
});
EDIT: Поэтому я немного изменил свою программу, чтобы быть совместимой с JS 5 (это была глупая ошибка с моей стороны), и теперь я столкнулся с другой ошибкой. Эта ошибка ломается, а затем записывается в журнал. Ошибка, которую я получаю: Error: predict() must take an object where the keys are the named inputs of the model: input.
Я считаю, что эта проблема возникает из-за того, что моя переменная data
не в правильном формате. Я думал, что если моя модель возьмет массив чисел 28x28, тогда data
также должны быть массивом 28x28, чтобы он мог правильно "предсказать" правильный вывод. Тем не менее, я считаю, что я что-то упускаю, и поэтому возникает ошибка. Этот вопрос очень похож на мой, однако он находится в питоне, а не в JS. Опять же, любая помощь будет оценена.
Хорошо, поэтому я понял, почему это происходит. Были две проблемы. Во-первых, массив data
должен быть сплющен, поэтому я написал быструю функцию, чтобы взять 2D-вход и "сгладить" его как 1D-массив длиной 784. Тогда, поскольку я использовал модель Sequential, ключевое имя данных не должно было быть 'input_1'
, а скорее 'input'
. Это избавило от всех ошибок.
Теперь, чтобы получить выходную информацию, мы просто можем сохранить ее в таком массиве: var out = outputData['output']
. Поскольку я использовал набор данных MNIST, out
был 1D массив длиной 10, который содержал вероятности каждой цифры, являющейся пользовательской цифрой. Оттуда вы можете просто найти номер с наивысшей вероятностью и использовать его как предикат для модели.