Javascript tensorflow.js-图像预测-图像的主颜色

Javascript tensorflow.js-图像预测-图像的主颜色,javascript,tensorflow,conv-neural-network,tensorflow.js,Javascript,Tensorflow,Conv Neural Network,Tensorflow.js,我希望你能帮助我。我在玩弄我的第一个tensorflow.js模型,但由于改进它而陷入困境 它应该预测的任务听起来“简单”:获取图像中物体的颜色 但我被卡住了也许有人能给我一个提示:-) 我的模型: 连续的 conv2d:过滤器:32, 内核大小:[3,3], 填充:“相同”, inputShape:[32,32,3], 内核初始化器:“varianceScaling” 激活:relu MaxPoolg2D:PoolSize:[2,2]步长:2 辍学率:0.5 conv2d:过滤器:64, 内

我希望你能帮助我。我在玩弄我的第一个tensorflow.js模型,但由于改进它而陷入困境

它应该预测的任务听起来“简单”:获取图像中物体的颜色

但我被卡住了也许有人能给我一个提示:-)

我的模型:

  • 连续的

  • conv2d:过滤器:32, 内核大小:[3,3], 填充:“相同”, inputShape:[32,32,3], 内核初始化器:“varianceScaling”

  • 激活:relu

  • MaxPoolg2D:PoolSize:[2,2]步长:2

  • 辍学率:0.5

  • conv2d:过滤器:64, 内核大小:[3,3], 填充:“相同”, 内核初始化器:“varianceScaling”

  • 激活:relu

  • MaxPoolg2D:PoolSize:[2,2]步长:2

  • 辍学率:0.5

  • 压扁

  • 密度:单位:1024

  • 激活:relu

  • 批次规格化:轴-1

  • 辍学率:0.5

  • 密度:单位(例如22)

  • 激活:softmax


我的数据

  • 数据中存在的所有颜色的一个列表(共22个条目)
  • 映射到其颜色示例的图像目录数组[[dir=>“img/image1.jpeg”,标签:“red”],[dir=>“img/image2.jpeg”,标签:“black”]

我的流程

用于图像 使用tf.node.decodeJpeg读取图像

将其归一化并将其推入张量数组

const offset = tf.scalar(127.5);
var tensor=tf.node.decodeJpeg(img, 3).resizeNearestNeighbor([32,32])
tensor = tensor.toFloat();
tensor = tensor.sub(offset).div(offset);
imageTensorArray.push(tensor);
标签

从Alllabels数组中获取标签的数字索引,并对其进行oneHot二值化

var imageLabels = imageLabelArray.map(function (d) {
        return allLabelsUnique.indexOf(d[1]); //index of label String in allLabels
    });
const imageLabelsHot=tf.oneHot(imageLabels, allLabelsUnique.length);
编译模型

列车模型


现在我的问题是:

  • acc正在好转-val_acc稳定在~0.339,损失:减少-val_损失,与时间或训练数据量无关

  • 预测永远是黑色的

我已经玩了很多次了,但是我没有得到“一”的帮助提示

  • trainImageTensors=tf.stack(buildImageToSensor(image))-这可能是个问题吗
模型管道:

我有一个csv它只是 颜色i,颜色ii,图片的url

然后我检查它是否已经在我的本地光盘上,如果没有,我下载它并保存在较小的大小:

img=canvas.loadImage(imageUrl) 
var cvs = new canvas.Canvas(32, 32);
var ctx = cvs.getContext('2d');
ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, cvs.width, cvs.height);
var data = ctx.canvas.toDataURL('image/jpeg').split(',');
            var buf = new Buffer.alloc(data[1].length, data[1], 'base64');
var dir = getlocalDir(url);
if (!fs.existsSync('img')) {
 fs.mkdirSync('img');
}
fs.writeFileSync(dir.toString(), buf, '');
在我有了图片或者如果它已经在存储器中,我使用内置函数将其作为张量读取

 //if local exists
 var dir = getlocalDir(url)
 var img = fs.readFileSync(dir);
 var tensor = tf.node.decodeJpeg(img, 3);
 //if not exists - ctx still there at the moment
 var tensor = tf.browser.fromPixels(ctx.canvas);
// then doing normalization
 tensor = tensor.toFloat();
 tensor = tensor.div(255.0);
 tensor = tf.image.cropAndResize(tensor.expandDims(0), [[15, 15, 30, 30]], [0], [15, 15], 'nearest').reshape([15, 15, 3]);
 imageTensorArray.push(tensor);
在这之后,工作开始了

const trainImageTensors = tf.slice(imageTensorArray, 0, totalSum);

///dataArray.images: [0]=>Url, [1]=>color (red,blue,green, etc...)
///dataArray.labels: collection of all colors available in dataset
var imageLabels = dataArray.images.map(function (d) {      
        return dataArray.labels.indexOf(d[1]);
    });

const imageLabelsHot = tf.oneHot(imageLabels, dataArray.labels.length);
const trainImageLabels = tf.slice(imageLabelsHot, 0, totalSum);
 const optimizer = tf.train.adam(0.00001, 0.00001 / 50,);
    model.compile({
        optimizer: optimizer,
        loss: "categoricalCrossentropy",
        metrics: ['accuracy']
    });

    await model.fit(trainImageTensors, trainImageLabels, {
        epochs: 50,
        verbose: 1,
        validationSplit: 0.4,
        shuffle: 1,
        batchSize: 100,
    });


图像处理似乎有问题。可以肯定的是,您是如何用数据拟合模型的
imageTensorArray
?您好。谢谢您的回复。我上周生病了,很抱歉反应太晚。
const trainImageTensors=tf.slice(imageTensorArray,0,totalSum);
以及以后的
等待model.fit(trainImageTensors,trainImageLabels,{epochs:20,verbose:1,validationSplit:0.3,shuffle:1,batchSize:32});
我发现类的权重在增加,但还没有时间进一步验证:)您正在将
张量
推到数组
ImageTensorray
之后是否对其进行重新编码?我想看看
ImageTensorray
从分配到使用。如果可能的话,您能将整个模型管道添加到问题中吗?谢谢您的重播,再次对迟来的响应表示抱歉,请继续使用其他pro对象,但现在是进一步研究的时候了:)。我添加了数据管道和建模,希望能有所帮助。我发现,如果我更改类权重,我可以增加一点值,但没什么大不了的:/对不起,我上次的回答。你试着打印预测的张量和一些训练张量,看看它们是否真的继续这是有趣的形象吗?
 //if local exists
 var dir = getlocalDir(url)
 var img = fs.readFileSync(dir);
 var tensor = tf.node.decodeJpeg(img, 3);
 //if not exists - ctx still there at the moment
 var tensor = tf.browser.fromPixels(ctx.canvas);
// then doing normalization
 tensor = tensor.toFloat();
 tensor = tensor.div(255.0);
 tensor = tf.image.cropAndResize(tensor.expandDims(0), [[15, 15, 30, 30]], [0], [15, 15], 'nearest').reshape([15, 15, 3]);
 imageTensorArray.push(tensor);
const trainImageTensors = tf.slice(imageTensorArray, 0, totalSum);

///dataArray.images: [0]=>Url, [1]=>color (red,blue,green, etc...)
///dataArray.labels: collection of all colors available in dataset
var imageLabels = dataArray.images.map(function (d) {      
        return dataArray.labels.indexOf(d[1]);
    });

const imageLabelsHot = tf.oneHot(imageLabels, dataArray.labels.length);
const trainImageLabels = tf.slice(imageLabelsHot, 0, totalSum);
 const optimizer = tf.train.adam(0.00001, 0.00001 / 50,);
    model.compile({
        optimizer: optimizer,
        loss: "categoricalCrossentropy",
        metrics: ['accuracy']
    });

    await model.fit(trainImageTensors, trainImageLabels, {
        epochs: 50,
        verbose: 1,
        validationSplit: 0.4,
        shuffle: 1,
        batchSize: 100,
    });