設置階段結束后就到了訓練階段了。不需要太多實現,因為所有的基礎都已在設置階段完成。首先,訓練階段可以用分類方法來定義。然后在 deeplearn.js 的數學環境中再次執行。此外,它還使用神經網絡實例所有的預定義特性來訓練算法。
class ColorAccessibilityModel {
...
train() {
math.scope(() => {
this.session.train(
this.costTensor,
this.feedEntries,
this.batchSize,
this.optimizer
);
});
}
}
export default ColorAccessibilityModel;
訓練方法是 1 個 epoch 的神經網絡訓練。因此,從外部調用時,調用必須是迭代的。此外,訓練只需要 1 個 epoch。為了多批次訓練算法,你必須將該訓練方法進行多次迭代運行。
這就是基礎的訓練階段。但是根據時間調整學習率可以改善訓練。學習率最初很高,但是當算法在每一步過程中逐漸收斂時,學習率會出現下降趨勢。
class ColorAccessibilityModel {
...
train(step) {
let learningRate = this.initialLearningRate * Math.pow(0.90, Math.floor(step / 50));
this.optimizer.setLearningRate(learningRate);
math.scope(() => {
this.session.train(
this.costTensor,
this.feedEntries,
this.batchSize,
this.optimizer
);
}
}
}
export default ColorAccessibilityModel;
在我們的情況中,學習率每 50 步下降 10%。下面,我們需要獲取訓練階段的損失,來驗證它是否隨著時間下降。損失可在每一次迭代時返回,不過這樣會導致較低的計算效率。神經網絡每次請求返回損失,就必須通過 GPU 才能實現返回請求。因此,我們在多次迭代后僅要求返回一次損失來驗證其是否下降。如果沒有請求返回損失,則訓練的損失下降常量被定義為 NONE(之前默認設置)。
import {
Array1D,
InCPUMemoryShuffledInputProviderBuilder,
Graph,
Session,
SGDOptimizer,
NDArrayMathGPU,
CostReduction,
} from 'deeplearn';
class ColorAccessibilityModel {
...
train(step, computeCost) {
let learningRate = this.initialLearningRate * Math.pow(0.90, Math.floor(step / 50));
this.optimizer.setLearningRate(learningRate);
let costValue;
math.scope(() => {
const cost = this.session.train(
this.costTensor,
this.feedEntries,
this.batchSize,
this.optimizer,
computeCost ? CostReduction.MEAN : CostReduction.NONE,
);
if (computeCost) {
costValue = cost.get();
}
});
return costValue;
}
}
export default ColorAccessibilityModel;
最后,這就是訓練階段。現在僅需要在訓練集上進行會話設置后從外部進行迭代執行。外部的執行取決于訓練方法是否返回損失。
推斷階段
最后一個階段是推斷階段,該階段使用測試集來驗證訓練算法的性能。輸入是背景顏色中的 RGB 顏色,輸出是算法為字體顏色是黑是白進行的 [ 0, 1 ] 或 [ 1, 0 ] 分類預測。由于輸入數據點經過歸一化,因此不要忘記在這一步也對顏色進行歸一化。
class ColorAccessibilityModel {
...
predict(rgb) {
let classifier = [];
math.scope(() => {
const mapping = [{
tensor: this.inputTensor,
data: Array1D.new(this.normalizeColor(rgb)),
}];
classifier = this.session.eval(this.predictionTensor, mapping).getValues();
});
return [ ...classifier ];
}
}
export default ColorAccessibilityModel;
該方法在數學環境中再次運行性能關鍵部分,需要定義一個映射,該映射最終可作為會話評估的輸入。記住,預測方法不是一定得在訓練階段后運行。它可以在訓練階段中使用,來輸出測試集的驗證。至此,神經網絡已經經歷了設置、訓練和推斷階段。
在 JavaScript 中可視化學習神經網絡
現在是時候使用神經網絡進行訓練和驗證/測試了。簡單的過程為建立一個神經網絡,使用一個訓練集運行訓練階段,代價函數取得最小值之后,使用一個測試集進行預測。所有的過程只需要使用網頁瀏覽器上的開發者控制臺的幾個 console.log statements 就可以完成。然而,由于該神經網絡是關于顏色預測的,并且 deeplearn.js 是在瀏覽器上運行,從而可以輕松地對神經網絡的訓練階段和測試階段進行可視化。
評論
查看更多