爲了體現 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,
}
之所以返回歸一化縮放用到最大、最小值。用途兩個,第一個是我們利用這些將數據進行還原,還有就是在預測時,可用這些值對新數據進行歸一化處理。