张量已处置

Tensor has disposed

大多数 TensorFlow JS 示例使用浏览器中的预训练模型进行预测。

这里我尝试在浏览器中创建自己的数据并用它训练模型。

最后,我认为我已经接近创建一个数据集,可以将其提供给 model.fit() 来训练模型

我有两个数组,一个包含图像,另一个包含标签。

let images = []
let labels = []

我正在使用一种方法从 canvas 捕获图像并将其推送到图像数组中。

function getImage() {
        return tf.tidy(() => {
            const image = tf.browser.fromPixels($('#mycanvas')[0]);
            const batchedImage = image.expandDims(0);
            const norm = batchedImage.toFloat().div(tf.scalar(255)).sub(tf.scalar(1));
            return norm;
        });
    }

因此,每当我按下任意一个箭头键时,我都会将图像和标签推送到数组

let collectData = (label) =>{
    tf.tidy(() => {
        const img = getImage();
        img.print() // check if it is a tensor
        //imges.concat(img)
        images.push(img)
        labels.push(label) // labels are 0,1,2
     })
 }

用训练数据集创建数组后,我将它们传递给 model.fit() 方法以开始训练。

let fitModel = async () => { 
        let imageSet = tf.stack(images);
        let labelSet = tf.oneHot(tf.tensor1d(lables, 'int32'), 3); 

        if (currentModel == null) {
            currentModel = createModel();
            currentModel.summary();
        }

        await currentModel.fit(imageSet, labelSet, {
            batchSize: 4,
            epochs: 20,
            shuffle: true,
            validationSplit: 0.1,
            callbacks: {
                onTrainBegin: () => console.log("Training Start"),
                onTrainEnd: () => console.log("Traing End"),
                onBatchEnd: async (num, log) => {
                    await tf.nextFrame();
                    console.log(log)
                }
            }
        })
    }

此处 tf.stack(images); 抛出错误说明 - Tensor 已处理 。我不明白为什么会这样。从技术上讲,这应该按照官方文档中的说明工作。

const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([3, 4]);
const c = tf.tensor1d([5, 6]);
let p = []
p.push(a)
p.push(b)
p.push(c)
console.log(p)
tf.stack(p).print();

所以我尝试了另一件事 - tf.stack(tf.tensor(images)) 并且我得到错误 Tensor has disposed.

我想尝试的另一件事是 - tf.concat() 也没有用。任何人都知道如何创建这样的可训练数据集。

我的第一个隐藏层有带 inputShape(150,300,3) 的 conv2d,输出层有 unit:3.

任何帮助将不胜感激。请解释您的答案以便更好地理解。

张量已被处置,因为您在使用它们之前调用了 tf.tidy。要使用张量 img 并清除所有中间张量,必须从 tf.tidy

的回调中显式返回它
const img = tf.tidy(() => {
        const im = getImage();
        return im;
        // since im is returned, it will not be disposed;
        // but all unused intermediate tensors will be cleaned up
     })

images.push(img)
labels.push(label) // labels are 0,1,2