Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用tensorflow.js和node.js在批量图像上建立训练模型_Node.js_Image_Tensorflow_Classification - Fatal编程技术网

使用tensorflow.js和node.js在批量图像上建立训练模型

使用tensorflow.js和node.js在批量图像上建立训练模型,node.js,image,tensorflow,classification,Node.js,Image,Tensorflow,Classification,我的目标是创建node.js脚本,在包含jpeg/png图像的文件夹中训练模型,并将其用于图像分类。我已经在中的图像集上生成了一个测试模型,并成功地在nodejs中加载了该模型——预测工作得很好 问题是,我现在正在努力复制nodejs中teachablemachine上使用的浏览器内逻辑,以便在本地训练模型。我不知道如何从tensor3d图像对象(代码中的readImage(path)output)组合输入张量。我使用了tf.stack,它似乎产生了正确的维度,但是拟合从未开始收敛,即使在50个

我的目标是创建node.js脚本,在包含jpeg/png图像的文件夹中训练模型,并将其用于图像分类。我已经在中的图像集上生成了一个测试模型,并成功地在nodejs中加载了该模型——预测工作得很好

问题是,我现在正在努力复制nodejs中teachablemachine上使用的浏览器内逻辑,以便在本地训练模型。我不知道如何从tensor3d图像对象(代码中的
readImage(path)
output)组合输入张量。我使用了
tf.stack
,它似乎产生了正确的维度,但是拟合从未开始收敛,即使在50个时代之后

我真的很感谢大家的意见,因为整个周末我都在为这个问题绞尽脑汁

以下是我使用的代码:

const tf=require('@tensorflow/tfjs');
const tfnode=require(“@tensorflow/tfjs node”);
常数fs=要求('fs');
const util=require('util');
const readdir=util.promisify(fs.readdir);
const IMAGE_HEIGHT=224;
const IMAGE_WIDTH=224;
常数标签\u平面\u尺寸=2;
函数readImage(路径){
const imageBuffer=fs.readFileSync(路径);
const tfimage=tfnode.node.decodeImage(imageBuffer,3);
常量smallimg=tf.image.resizeblinear(tfimage,[图像高度,图像宽度])
常量floatimg=tf.cast(smallimg,'float32');
返回浮动img;
}
异步函数loadImagesDir({images},dir){
让文件计数=0;
试一试{
files=wait readdir(dir);
forEach(函数(文件){
如果(/^(?)。*\((png)|(jpg)|(jpeg)|(gif))$/gi.test(文件)){
console.log(文件);
让此_image=readImage(dir+'/'+文件);
图像。推送(此图像);
文件计数++;
}
});
}捕捉(错误){
console.error('无法扫描目录:'+err);
}
返回文件计数;
}
函数getLabelsSubArray(图像计数,classId){
返回数组(图像计数).fill(classId);
}
异步函数loadImages(){
常量图像=[];
让标签=[];
让imgcount;
image_count=等待加载imagesdir({images},'train_data/squares');
labels=labels.concat(getLabelsSubArray(image_count,1));
image_count=wait loadImagesDir({images},'train_data/circles');
labels=labels.concat(getLabelsSubArray(image_count,2));
返回{图像:图像,标签:标签};
}
异步函数loadTestImages(){
常量图像=[];
让标签=[];
让imgcount;
image_count=wait loadImagesDir({images},'test_data/squares');
labels=labels.concat(getLabelsSubArray(image_count,1));
image_count=wait loadImagesDir({images},'test_data/circles');
labels=labels.concat(getLabelsSubArray(image_count,2));
返回{图像:图像,标签:标签};
}
/**帮助类处理加载训练和测试数据*/
类MnistDataset{
构造函数(){
this.dataset=null;
此值为0.trainSize=0;
this.testSize=0;
此.trainBatchIndex=0;
this.testBatchIndex=0;
}
/**加载培训和测试数据*/
异步加载数据(){
this.dataset=wait Promise.all([
loadImages(),loadTestImages()
]);
this.trainSize=this.dataset[0].images.length;
this.testSize=this.dataset[1].images.length;
log(“LEN:,this.trainSize,this.testSize”);
}
getTrainData(){
返回此.getData(true);
}
getTestData(){
返回此.getData(false);
}
getData(isTrainingData){
让图像索引;
让标签索引;
如果(isTrainingData){
imagesIndex=0;
}否则{
图像索引=1;
}
返回{
images:tf.stack(this.dataset[imagesIndex].images),
标签:tf.oneHot(tf.tensor1d(标签'int32'),标签为扁平尺寸)
};
}
}

module.exports=新的MnistDataset()帮不了你,但我可以问一下:你在用密集单元=64做什么?