TensorflowJS模型不';不能正确预测多类数据
作为一个初学者,我尝试用tensorflowJS构建一个非常简单的多类分类器,它可以预测我的视力方向 步骤1:我在浏览器中创建了数据集来训练我的模型,在那里我将网络摄像头渲染的眼睛图像存储在HTML5画布上。我使用箭头键将图像标记为0=左、1=正常和2=右。为了训练模型,在传递给方法之前,我使用tf.onHot()转换这些标签TensorflowJS模型不';不能正确预测多类数据,tensorflow,machine-learning,tensorflow.js,Tensorflow,Machine Learning,Tensorflow.js,作为一个初学者,我尝试用tensorflowJS构建一个非常简单的多类分类器,它可以预测我的视力方向 步骤1:我在浏览器中创建了数据集来训练我的模型,在那里我将网络摄像头渲染的眼睛图像存储在HTML5画布上。我使用箭头键将图像标记为0=左、1=正常和2=右。为了训练模型,在传递给方法之前,我使用tf.onHot()转换这些标签 // data collection let imageArray = []; let labelArray = []; let collectData = (lab
// data collection
let imageArray = [];
let labelArray = [];
let collectData = (label) => {
const img = tf.tidy(() => {
const captureImg = getImage();
//console.log(captureImg.shape)
return captureImg;
})
imageArray.push(img)
labelArray.push(label) //--- labels are 0,1,2
}
// label conversion
let labelSet = tf.oneHot(tf.tensor1d(labelArray, 'int32'), 3);
第2步:我使用了使用tensorflowJS构建的自定义模型,而不是加载任何经过训练的模型
let createModel = () => {
const model = tf.sequential();
let config_one = {
kernelSize: 3,
filters: 40,
strides: 1,
activation: 'relu',
inputShape: [imageHeight, imageWidth, imageChannels]
}
model.add(tf.layers.conv2d(config_one));
let config_two = {
poolSize: [2, 2],
strides: [2, 2],
}
model.add(tf.layers.maxPooling2d(config_two));
model.add(tf.layers.flatten());
model.add(tf.layers.dropout(0.2));
// Two output values x and y
let congfig_output = {
units: 3,
activation: 'tanh',
}
model.add(tf.layers.dense(congfig_output));
// Use ADAM optimizer with learning rate of 0.0005 and MSE loss
let config_compile = {
optimizer: tf.train.adam(0.00005),
loss: 'categoricalCrossentropy',
}
model.compile(config_compile);
tf.memory()
return model;
}
问题:我现在面临几个问题
function getImage() {
return tf.tidy(function () {
const image = tf.browser.fromPixels($('#eyes')[0]);
const batchedImage = image.expandDims(0);
const norm = batchedImage.toFloat().div(tf.scalar(255)).sub(tf.scalar(1));
return norm;
});
}
这里是控制台输出
示例图像-
对我来说,最明显的错误是输出层的激活功能,您使用的是
tanh
您应该使用softmax
。接下来,您的学习率很低,请尝试将其设置为0.001
,这是一个很好的默认值
您也可能不需要退出,因为您还没有得到任何结果来证明模型是过度拟合的。您还可以在此基础上添加更多卷积层,请尝试下面的示例
model.add(tf.layers.conv2d({
inputShape: [28, 28, 1],
kernelSize: 5,
filters: 8,
strides: 1,
activation: 'relu',
}));
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2],
strides: [2, 2],
}));
model.add(tf.layers.conv2d({
kernelSize: 5,
filters: 16,
strides: 1,
activation: 'relu',
}));
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2],
strides: [2, 2],
}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({
units: 3,
activation: 'softmax',
}));
const LEARNING_RATE = 0.001;
const optimizer = tf.train.adam(LEARNING_RATE);
model.compile({
optimizer: optimizer,
loss: 'categoricalCrossentropy',
metrics: ['accuracy'],
});
谢谢你的回复。我试过你的建议,可惜没用。我已经用控制台输出更新了我的问题。请检查。好的。在将图像传递到模型之前,您是否已将图像从值
0-255
标准化为0-1
?是的,我已标准化。使用update getImage code()检查问题是否可以包含每个类的图像样本?完成。我为三个标签添加了示例图像。