Tensoflw.js - 02 - 模型與內存管理(易懂)
Tensoflw.js - 02 - 模型與內存管理(易懂)
參考 W3Cschool 文檔:https://www.w3cschool.cn/tensorflowjs/
本文主要翻譯一些英文註釋,添加通俗的註釋,記錄新手使用遇到的小問題,去除不必要的部分,幫助新手快速入門
上一篇介紹了,Tensorflow.js 的安裝,張量與變量的表示方法、創建和輸出
Tensoflw.js - 01 - 安裝與入門(中文註釋)
本篇介紹模型與內存管理
Tensorflow.js 模型:
1.在 Tensorflow.js 中,一個模型就是一個給定一些輸入將會產生特定的輸出的函數。簡單來說,一個模型就是一個函數,只是它完成了特定的任務
2.在 TensorFlow.js 中有兩種方式來創建模型:
- 一種是通過操作(ops)來直接完成模型本身所做的工作
- 另外一種就是通過高級API tf.model 來創建一個模型,顯然第二種是更容易的
第一種創建模型的方法:
提示:可能有小夥伴沒有看上一篇,可以直接使用在線引入:
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]"> </script>
<script> //直接將代碼拷貝到有引入 Tensorflow.js 的 html 中即可 //提示:輸出的值都是打印在瀏覽器開發者工具的控制臺,而不是頁面上 //定義一個函數進行對輸入參數的一系列操作 function predict(input) { // y = a * x ^ 2 + b * x + c // More on tf.tidy in the next section return tf.tidy(() => { const x = tf.scalar(input); const ax2 = a.mul(x.square()); const bx = b.mul(x); const y = ax2.add(bx).add(c); return y; }); } //上一篇介紹的 tf.scalar(零維) const a = tf.scalar(2); const b = tf.scalar(4); const c = tf.scalar(8); const result = predict(2); result.print() </script>
如上所示,我們定義的 predict 函數就是一個模型,對於給定的輸入,我們就可以得到預測的輸出。註意:所有的數字都需要經過 tf.scalar() 張量處理
第二種創建模型的方法:
用 TensorFlow.js 中的 tf.model 方法(這裏的 model 並不是真正可以調用的方法,而是一個總稱,比如實際上可以調用的是 tf.sequential 模型),這在深度學習中是非常流行的概念。 下面的代碼就創建了 tf.sequential 模型:
<script> //直接將代碼拷貝到有引入 Tensorflow.js 的 html 中即可 //提示:輸出的值都是打印在瀏覽器開發者工具的控制臺,而不是頁面上 const model = tf.sequential(); model.add( tf.layers.simpleRNN({ units: 20, recurrentInitializer: 'GlorotNormal', inputShape: [80, 4] }) ); const optimizer = tf.train.sgd(LEARNING_RATE); model.compile({optimizer, loss: 'categoricalCrossentropy'}); model.fit({x: data, y: labels)}); </script>
Tensorflow.js 內存管理
因為 TensorFlow.js 使用了GPU來加速數學運算,因此當 tensorflow 處理張量和變量時就有必要來管理 GPU 內存。在 TensorFlow.js 中,我們可以通過 dispose 和 tf.tidy 這兩種方法來管理內存
dispose
您可以在張量或變量上調用dispose來清除它並釋放其GPU內存:
<script>
//直接將代碼拷貝到有引入 Tensorflow.js 的 html 中即可
//提示:輸出的值都是打印在瀏覽器開發者工具的控制臺,而不是頁面上
const x = tf.tensor2d([[0.0, 2.0], [4.0, 6.0]]);
const x_squared = x.square();
x.dispose();
x_squared.dispose();
</script>
tf.tidy
進行大量的張量操作時使用dispose可能會很麻煩。 TensorFlow.js提供了另一個函數tf.tidy,它對JavaScript中的常規範圍起到類似的作用,不同的是它針對GPU支持的張量
tf.tidy執行一個函數並清除所有創建的中間張量,釋放它們的GPU內存。 它不清除內部函數的返回值
<script>
//直接將代碼拷貝到有引入 Tensorflow.js 的 html 中即可
//提示:輸出的值都是打印在瀏覽器開發者工具的控制臺,而不是頁面上
const average = tf.tidy(() => {
const y = tf.tensor1d([1.0, 2.0, 3.0, 4.0]);
const z = tf.ones([4]);
return y.sub(z).square().mean();
});
average.print()
</script>
使用 tf.tidy 將有助於防止應用程序中的內存泄漏。它也可以用來更謹慎地控制內存何時回收
兩個重要的註意事項:
傳遞給 tf.tidy 的函數應該是同步的,並且不會返回 Promise。我們建議在 tf.tidy 內不要有更新 UI 或在發出遠程請求的代碼
tf.tidy 不會清理變量。變量通常持續到機器學習模型的整個生命周期,因此TensorFlow.js 不會清理它們,即使它們是在 tidy 中創建的。不過,您可以手動調用dispose處理它們
Tensoflw.js - 02 - 模型與內存管理(易懂)