получить неправильный прогноз с пользовательской моделью после загрузки сохранить модель в tenorflow.js - PullRequest
0 голосов
/ 28 февраля 2019

После компиляции и обучения моей пользовательской модели я сохранил ее и получил два файла, таких как .bin и .json.Кроме того, я загрузил эту пользовательскую модель на другую страницу, где я предоставляю изображения в качестве входных данных, которые я использовал для обучения этой модели и получения прогноза для этих изображений на основе загруженной пользовательской модели.

Поскольку она работает нормальнодля некоторых изображений, но с неверным прогнозом для других изображений.

Это мой код:

        $("#predict-button").click(async function(){
        let image= $('#selected-image').get(0);
        let image1 = $('#selected-image1').get(0);
        console.log('image:::',image);
        console.log('image1:::',image1);
        let tensorarr = [];
        let tensor1 = preprocessImage(image,$("#model-selector").val());
        tensorarr.push(tensor1);
        let tensor2 = preprocessImage(image1,$("#model-selector").val());
        tensorarr.push(tensor2);
        let resize_image = [];
        let resize;
        for(var i=0; i<tensorarr.length; i++)
        {
            resize = tf.reshape(tensorarr[i], [1, 224, 224, 3],'resize');
            console.log('resize:::',resize);
            resize_image.push(resize);
        }
        // Labels
        const label = ['Shelf','Rack'];
        const setLabel = Array.from(new Set(label));
        let ysarr =[];
        const ys = tf.oneHot(tf.tensor1d(label.map((a) => setLabel.findIndex(e => e === a)), 'int32'), 10)
        console.log('ys:::'+ys);
        const y = tf.reshape(ys, [-1]);
        y.print();
        const d = y.slice([0], [10]);
        d.print();
        ysarr.push(d);
        const e = y.slice([10], [10]);
        e.print();
        ysarr.push(e);
        console.log('ysarr',ysarr);
        model.add(tf.layers.conv2d({
            inputShape: [224, 224 , 3],
            kernelSize: 5,
            filters: 8,
            strides: 1,
            activation: 'relu',
            kernelInitializer: 'VarianceScaling'
        }));

        model.add(tf.layers.maxPooling2d({poolSize: 2, strides: 2}));
        model.add(tf.layers.maxPooling2d({poolSize: 2, strides: 2}));
        model.add(tf.layers.flatten({}));
        model.add(tf.layers.dense({units: 64, activation: 'relu'}));
        model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
        model.compile({
            loss: 'meanSquaredError',
            optimizer : 'sgd'
        })
        console.log('model:::'+model);
        // Train the model using the data.
        let tesnor_dim =[];
        let tensr;
        for(var j=0; j<2; j++){
            console.log('resize_image',resize_image);
            tensr = tf.expandDims(ysarr[j], 0);
            tesnor_dim.push(tensr);
            console.log('tesnor_dim',tesnor_dim);
            console.log('before resize_image[j]',resize_image[j]);
            console.log('before tesnor_dim[j]',tesnor_dim[j]);
            await model.fit(resize_image[j], tesnor_dim[j], {epochs: 100}).then((loss) => {
                console.log('resize_image.get[j]',resize_image[j]);
                console.log('tesnor_dim[j]',tesnor_dim[j]);
                console.log('loss',loss);
                const t = model.predict(resize_image[j]);
                console.log('Prediction:::'+t);
                pred = t.argMax(1).dataSync(); // get the class of highest probability
                const labelsPred = Array.from(pred).map(e => setLabel[e]);
                console.log('labelsPred:::'+labelsPred);

            }).catch((e) => {
                console.log(e.message);
            })
            }     
                const saveResults = model.save('downloads://my-model-1');
                console.log(saveResults);   
            });

1 Ответ

0 голосов
/ 28 февраля 2019

Модель дает неверный прогноз.Что делать?

  • проверить точность модели.Очень низкая точность модели будет указывать, что модель либо не подходит для решаемой задачи, либо что некоторые параметры необходимо изменить.

  • , даже если точность хорошаяМодель может быть неправильной в прогнозировании определенного класса.В этом случае матрица путаницы будет очень полезна для определения неверно предсказанных классов.Когда эти классы определены, можно использовать больше обучающих данных для этих классов, чтобы повысить их точность после обучения


Глядя на модель вопроса, становится очевидным, что онявляется классификационной моделью, т. е. для данного изображения модель будет предсказывать класс, к которому принадлежит изображение.

'meanSquaredError' потери - не лучшая функция потерь для задачи классификации.categoricalCrossEntropy достигнет наилучшей точности.Даже после изменения функции потерь точность может быть не такой, как ожидается.Затем нужно добавить больше слоев, изменить другие параметры модели.Затем тренируют и сравнивают точность, и цикл продолжается ...

...