【问题标题】:output of predict in Tensorflow.js always show first exampleTensorflow.js 中预测的输出总是显示第一个示例
【发布时间】:2020-09-15 12:29:58
【问题描述】:

我最近在浏览器中学习了一个使用TensorFlow js的图像分类器,我做了一个简单的图像分类,可以识别Giorno和Jotaro的图像,但是在预测新图像时,结果总是显示第一个示例(Jotaro)我补充说,我正在尝试检查添加第二个示例(Giorno)的第二个函数,它在控制台中很好,并且运行良好,这是我的代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Giorno and Jotaro Classifier</title>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/knn-classifier"></script>
</head>
<body>
<h1>Test Image</h1>
<img id="predict" src="anime/test_giorno.jpg" alt="" width="300">
</body>
</html>
<script>

const initScript = async function(){
const ClassifierKNN = knnClassifier.create();
const mobileneModule = await mobilenet.load();


for(let i=1; i<=3;i++){
    const im = new Image(300,300);
    im.src = 'anime/jotaro/'+i+'.jpg';
    im.onload = ()=>{
        let trainingImageJotaro = tf.browser.fromPixels(im);
        let predJotaro = mobileneModule.infer(trainingImageJotaro,'conv_preds');
        if(i)
        ClassifierKNN.addExample(predJotaro,"Jotaro");
    }
    im.onload();
}

for(let i=1; i<=3;i++){
    const im2 = new Image(300,300);
    im2.src = 'anime/giorno/'+i+'.jpg';
    im2.onload = ()=>{
        let trainingImageGiorno = tf.browser.fromPixels(im2);
        let predGiorno = mobileneModule.infer(trainingImageGiorno,'conv_preds');
        ClassifierKNN.addExample(predGiorno,"Giorno");
    }
    im2.onload();
}


let imgX = document.getElementById('predict');
const tensorX = tf.browser.fromPixels(imgX);
const logitsX = mobileneModule.infer(tensorX,'conv_preds');
let result = await ClassifierKNN.predictClass(logitsX);
console.log('outout:');
console.log(result);

}
initScript();

</script>

脚本的结果总是jotaro,但是当我像这样切换循环位置时:

for(let i=1; i<=3;i++){
const im2 = new Image(300,300);
im2.src = 'anime/giorno/'+i+'.jpg';
im2.onload = ()=>{
    let trainingImageGiorno = tf.browser.fromPixels(im2);
    let predGiorno = mobileneModule.infer(trainingImageGiorno,'conv_preds');
    ClassifierKNN.addExample(predGiorno,"Giorno");
}
im2.onload();
}

for(let i=1; i<=3;i++){
    const im = new Image(300,300);
    im.src = 'anime/jotaro/'+i+'.jpg';
    im.onload = ()=>{
        let trainingImageJotaro = tf.browser.fromPixels(im);
        let predJotaro = mobileneModule.infer(trainingImageJotaro,'conv_preds');
        if(i)
        ClassifierKNN.addExample(predJotaro,"Jotaro");
    }
    im.onload();
   }

结果总是 Giorno,有人可以帮我解决这个问题吗?

【问题讨论】:

  • 这个问题已经修复,出现上题的问题是因为第二个训练数据是在测试数据之后执行的,所以上面的代码只有1个标签,因为第二个标签还没有执行。因此预测图像的输出标签总是显示第一个训练数据的标签

标签: tensorflow tensorflow.js


【解决方案1】:

感谢 @zer0sign,在 cmets 中分享解决方案。为了社区的利益,我在这里提供解决方案(答案部分)

这个问题已经修复,出现上面的问题是因为第二个训练数据是在测试数据之后执行的,所以上面的代码只有1个标签,因为第二个标签还没有被执行,所以预测的输出标签图像始终显示第一个训练数据的标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2023-04-01
    相关资源
    最近更新 更多