我正在編寫一個腳本,它有時會泄漏張量。這可能在多種情況下發生,例如當我訓練神經網絡時,但訓練崩潰了。在這種情況下,訓練被中斷并且不會正確地處理張量。這會導致內存泄漏,我試圖通過處理未使用的張量來清理它。例子在下面的片段中,我正在訓練兩個(非常簡單的)模型。第一次運行將起作用并且不會導致張量泄漏(訓練前的張量數 = 訓練后的張量數)。第二次,我reshape在訓練期間使用無效層強制崩潰。因此,會拋出錯誤,并且數據集中的張量(我猜?)將不會被正確處理。該代碼是展示張量可能如何泄漏的示例。async function train(shouldCrash) { console.log(`Training, shouldCrash=${shouldCrash}`); const dataset = tf.data.zip({ // setup data xs: tf.data.array([[1],[1]]), ys: tf.data.array([1]), }).batch(1); const model = tf.sequential({ // setup model layers: [ tf.layers.dense({units: 1, inputShape: [1]}), tf.layers.reshape({targetShape: [(shouldCrash ? 2 : 1)]}), // use invalid shape when crashing ], }); model.compile({ optimizer: 'sgd', loss: 'meanSquaredError' }); console.log(' Tensors before:', tf.memory().numTensors); try { const history = await model.fitDataset(dataset, { epochs: 1 }); } catch (err) { console.log(` Error: ${err.message}`); } console.log(' Tensors after:', tf.memory().numTensors);}(async () => { await train(false); // normal training await train(true); // training with error})();<script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tf.min.js"></script>問題有tf.tidy, 在某些情況下可以幫助我處理未使用的張量,但它只能用于同步函數調用。因此,在調用await model.fitDataset(...).有沒有辦法處理任何未使用的張量?或者,有沒有辦法處理頁面上所有現有的張量(無需重新加載)?
Tensorflow.js 中的內存泄漏:如何清理未使用的張量?
慕婉清6462132
2021-06-22 15:08:05