如何解决tensorflowjs:将预测数组显示为图像
在下面的js代码中,我将模型作为promise加载:
tf.loadLayersModel('../tfjs-models/hadwritten-digits/model.json')
现在,我使用的 model.predict 将返回一个形状为 (1,128,1) 的张量,即一个灰度图像。我现在有很多关于承诺和等待的问题。我在 index.html 中有一个具有已知 ID 的画布,我想将图像放入其中。现在需要一些帮助。
async function generate() {
let input = document.getElementById("slider").value
console.log(`Random Noisy Input Mean is ${input}`)
tf.loadLayersModel('../tfjs-models/hadwritten-digits/model.json').then(async (model) => {
tensor = tf.tensor([randomnormal(100,input,0.5)]);
result = await model.predict(tensor).array()
document.getElementById("myCanvas").getContext("3d").putImageData(
new ImageData(Uint8ClampedArray.from(result),1,1),1);
});
}
错误
model.js:39 Uncaught (in promise) TypeError: Cannot read property 'putImageData' of null
at model.js:39
我对 javascript 很陌生,python 是我的主要语言。 我需要为我的 GAN 模型搭建一个前端。我觉得使用 tfjs 比从flask 或 django 提供结果更冒险。所以任何帮助对我来说都是很大的:)
已解决
async function generate() {
let input = document.getElementById("slider").value
console.log(`Random Noisy Input Mean is ${input}`)
inputtensor = tf.tensor([randomnormal(100,0.5)]);
outputtensor = await model.predict(inputtensor)
result = outputtensor.mul([1,1]).dataSync()
for(var i=0;i<result.length;i++){
result[i]=result[i]*255.0 + 128.0;
}
document.getElementById("myCanvas").getContext("2d").putImageData(
new ImageData(Uint8ClampedArray.from(result),128),1);
}
var model;
tf.loadLayersModel('../tfjs-models/hadwritten-digits/model.json').then(async (resolve) => {
model=resolve
});
解决方法
代码中有几处需要修改
-
目前没有
3d
上下文,有2d
上下文。 -
此外,Uint8ClampedArray 需要一个扁平化数组。因此,与其使用
array
(分别为arraySync
),不如使用data
(分别为dataSync
)。 -
ImageData 需要图像的宽度和高度。图像宽度和高度各为 1 像素的可能性不大。因此可能需要更改赋予
的参数ImageData
简短示例
tensor = tf.ones([5,5,4]);
new ImageData(Uint8ClampedArray.from(tensor.dataSync()),5);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。