张量已处置
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
大多数 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