Следующая строка вызывает утечку памяти.
await tf.browser.toPixels(val, temp);
val
- это массив измерений img_size * img_size
, а temp
- это холст. Один тензор не утилизируется. Поскольку это асинхронный вызов, его нельзя поместить в tf.tidy()
. Также согласно официальной документации tf.browser.toPixels()
должен вернуть обещание. Так как мы можем расположить формирующийся тензор? (Размер тензора = img_size * img_size * 4)
Соответствующий код:
let val ; //val is an array not a tensor
tf.tidy(()=>{
let values = model.predict(batched).dataSync(); //batched is a tensor
values = Array.from(values);
//scale values
values = values.map(x => x * 255)
val = new Array();
while (values.length > 0) val.push(values.splice(0, image_size));
});
await tf.browser.toPixels(val, temp); //this line causes leak,commenting it fixes it
finalRes.getContext('2d').drawImage(temp, dx, dy);