在 tensorflow.js 中加载保存模型后使用自定义模型预测错误
getting wrong prediction with custom model after loading save model in tensorflow.js
自定义模型编译训练好后保存,得到.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);
});
模型给出了错误的预测。怎么办?
检查模型的准确性。模型的准确性非常低表明该模型不是解决问题的正确模型,或者需要更改某些参数。
即使准确度很好,模型在预测特定 class 时也可能出错。在那种情况下,混淆矩阵将有助于识别错误预测的 classes。当那些 classes 被识别出来后,人们可以为那些 classes 使用更多的训练数据来提高它们在训练后的准确性
查看问题的模型,很明显它是一个 class 化模型,即给定一张图像,该模型将预测图像所属的 class。
'meanSquaredError'
损失不是 class化问题的最佳损失函数。 categoricalCrossEntropy
将达到最佳准确度。即使在改变损失函数之后,准确率可能仍然达不到预期。然后需要添加更多层,更改模型的其他参数。然后再训练,对比准确率,如此循环……
自定义模型编译训练好后保存,得到.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);
});
模型给出了错误的预测。怎么办?
检查模型的准确性。模型的准确性非常低表明该模型不是解决问题的正确模型,或者需要更改某些参数。
即使准确度很好,模型在预测特定 class 时也可能出错。在那种情况下,混淆矩阵将有助于识别错误预测的 classes。当那些 classes 被识别出来后,人们可以为那些 classes 使用更多的训练数据来提高它们在训练后的准确性
查看问题的模型,很明显它是一个 class 化模型,即给定一张图像,该模型将预测图像所属的 class。
'meanSquaredError'
损失不是 class化问题的最佳损失函数。 categoricalCrossEntropy
将达到最佳准确度。即使在改变损失函数之后,准确率可能仍然达不到预期。然后需要添加更多层,更改模型的其他参数。然后再训练,对比准确率,如此循环……