#tensorflow.js
#tensorflow.js
Вопрос:
Я просмотрел руководство tensorflowjs по распознаванию рукописных цифр для узла, и в итоге у меня есть папка с двумя файлами: model.json, weights.bin. Теперь я хочу использовать эту модель для распознавания числа на изображении.
const tf = require('@tensorflow/tfjs-node');
const path = require('path');
const jimp = require('jimp');
async function loadModel() {
const model = await tf.loadLayersModel(`file://${path.resolve('./model/model.json')}`); // load model
jimp.read('img0.png').then(img => { // load image with white background and black handwritten number
img.resize(28, 28).greyscale().invert(); // resize the image and make background black and the number itself white
console.log(img.bitmap.data.length);
const buffer = img.bitmap.data.reduce((acc, curr, idx) => { // removing gba bytes so we have only value of r, which is a number in range 0-255
if (idx % 4 === 0) {
acc.push(curr);
}
return acc;
}, []);
console.log(buffer.length); // now we have 28x28 bytes
const imageShape = [buffer.length, 28, 28, 1]; // I have no idea
const image = new Float32Array(tf.util.sizeFromShape(imageShape)); // what
image.set(buffer); // I'm
const prediction = model.execute(tf.tensor4d(image, imageShape)); // doing
console.log(prediction); // here
});
}
loadModel();
Итак, у меня есть буфер из 784 байт, который соответствует 784 значениям пикселей изображения, и я хочу получить предсказание в виде одного числа, но я не знаю, как это сделать.
ОБНОВЛЕНИЕ: я использовал predict
вместо execute
, а затем вызвал print()
, и это дало мне результат!
Ответ №1:
Чтобы использовать вашу модель для вывода, тензор должен иметь форму [28,28,1] для одного изображения. Но поскольку модель predict принимает пакеты изображений, тензор для передачи его вашей функции predict должен иметь форму [b, 28,28,1], где b — количество изображений, количество которых должно быть предсказано. Также рассмотрите возможность использования predict
вместо execute
.
Вот изменение:
const image = new Float32Array(28*28*1);
image.set(buffer);
const prediction = model.predict(tf.tensor4d(image, [1, 28, 28, 1]))
Комментарии:
1. теперь он сообщает об ошибке: не удается найти символьные значения для выходных имен: [null]. Я предполагаю, что мне нужно передать эти символьные тензоры в качестве второго параметра execute в виде массива строк или просто одной строки, но какие значения я должен использовать? Я попробовал «точность», но это не помогло получить результаты.
2. да, но мне это не очень помогло, так как к тому времени я уже разобрался