瀏覽器端的機器學習 tensorflowjs(5) 數據處理

爲了體現 TensorFlow.js 的性能優勢,需要將數據轉換成張量,同時來需要進行一些處理如洗牌和歸一化,具體做法代碼裏見。

/**
 * 將輸入數據轉換可以喂入機器張量(tensors)
 * 對數據進行洗牌和標準化處理
 */
 function convertToTensor(data) {
    // 對數據進行操作包裹在一個 tidy 函數內。
  
    return tf.tidy(() => {
      // Step 1. 對數據進行隨機排序,這樣便於多輪訓練
      tf.util.shuffle(data);
  
      // Step 2. 將數據轉換爲 Tensor
      const inputs = data.map(d => d.horsepower)
      const labels = data.map(d => d.mpg);
  
      const inputTensor = tf.tensor2d(inputs, [inputs.length, 1]);
      const labelTensor = tf.tensor2d(labels, [labels.length, 1]);
  
      //Step 3. 將數據歸一化,也就是將數據取值範圍控制到  0 - 1 如果多特徵可以消除正常差異性,便於訓練
      const inputMax = inputTensor.max();
      const inputMin = inputTensor.min();
      const labelMax = labelTensor.max();
      const labelMin = labelTensor.min();
  
      const normalizedInputs = inputTensor.sub(inputMin).div(inputMax.sub(inputMin));
      const normalizedLabels = labelTensor.sub(labelMin).div(labelMax.sub(labelMin));
  
      return {
        inputs: normalizedInputs,
        labels: normalizedLabels,
        // 返回  最小/最大界限
        inputMax,
        inputMin,
        labelMax,
        labelMin,
      }
    });
  }

數據洗牌

tf.util.shuffle(data);

每次訓練數據前我們需要將數據的順序打亂好處是更利於訓練。因爲在訓練過程中,數據集通常被分成較小的子集,也就是所謂批次,模型在進行訓練,讓模型每次看到數據都是多樣變化的。

轉換爲張量

const inputs = data.map(d => d.horsepower)
const labels = data.map(d => d.mpg);

const inputTensor = tf.tensor2d(inputs, [inputs.length, 1]);
const labelTensor = tf.tensor2d(labels, [labels.length, 1]);

我們這裏數據有兩個維度,也就是有兩個特徵,一個特徵作爲輸入(馬力),另一個是真實值(在機器學習中被稱爲標籤)其實真實值也是數據一個特徵。

然後將每個數組轉換爲一個 2d 張量。該張量的形狀爲 [num_examples, num_features_per_example]。其中 inputs.length 是樣本數量,每個樣本有 1 個輸入特徵(馬力)。

數據標準化

const inputMax = inputTensor.max();
const inputMin = inputTensor.min();
const labelMax = labelTensor.max();
const labelMin = labelTensor.min();

const normalizedInputs = inputTensor.sub(inputMin).div(inputMax.sub(inputMin));
const normalizedLabels = labelTensor.sub(labelMin).div(labelMax.sub(labelMin));

對數據進行歸一化處理,也可以稱爲標準化處理。通過對數據進行縮放,讓所有數據取值範圍都在 0-1 這個範圍。歸一化其實很重要,好處消除不同取值範圍特徵之間差異性,同時模型更喜歡0 到 1 或者 -1 到 1 這樣的小數。

return {
  inputs: normalizedInputs,
  labels: normalizedLabels,
  // Return the min/max bounds so we can use them later.
  inputMax,
  inputMin,
  labelMax,
  labelMin,
}

之所以返回歸一化縮放用到最大、最小值。用途兩個,第一個是我們利用這些將數據進行還原,還有就是在預測時,可用這些值對新數據進行歸一化處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章