1. 程式人生 > >Tensoflw.js - 02 - 模型與內存管理(易懂)

Tensoflw.js - 02 - 模型與內存管理(易懂)

UNC 同步 任務 運算 average 定義 並不是 添加 列操作

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 - 模型與內存管理(易懂)