設(shè)置階段結(jié)束后就到了訓(xùn)練階段了。不需要太多實現(xiàn),因為所有的基礎(chǔ)都已在設(shè)置階段完成。首先,訓(xùn)練階段可以用分類方法來定義。然后在 deeplearn.js 的數(shù)學(xué)環(huán)境中再次執(zhí)行。此外,它還使用神經(jīng)網(wǎng)絡(luò)實例所有的預(yù)定義特性來訓(xùn)練算法。
class ColorAccessibilityModel {
...
train() {
math.scope(() => {
this.session.train(
this.costTensor,
this.feedEntries,
this.batchSize,
this.optimizer
);
});
}
}
export default ColorAccessibilityModel;
訓(xùn)練方法是 1 個 epoch 的神經(jīng)網(wǎng)絡(luò)訓(xùn)練。因此,從外部調(diào)用時,調(diào)用必須是迭代的。此外,訓(xùn)練只需要 1 個 epoch。為了多批次訓(xùn)練算法,你必須將該訓(xùn)練方法進(jìn)行多次迭代運行。
這就是基礎(chǔ)的訓(xùn)練階段。但是根據(jù)時間調(diào)整學(xué)習(xí)率可以改善訓(xùn)練。學(xué)習(xí)率最初很高,但是當(dāng)算法在每一步過程中逐漸收斂時,學(xué)習(xí)率會出現(xiàn)下降趨勢。
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;
在我們的情況中,學(xué)習(xí)率每 50 步下降 10%。下面,我們需要獲取訓(xùn)練階段的損失,來驗證它是否隨著時間下降。損失可在每一次迭代時返回,不過這樣會導(dǎo)致較低的計算效率。神經(jīng)網(wǎng)絡(luò)每次請求返回?fù)p失,就必須通過 GPU 才能實現(xiàn)返回請求。因此,我們在多次迭代后僅要求返回一次損失來驗證其是否下降。如果沒有請求返回?fù)p失,則訓(xùn)練的損失下降常量被定義為 NONE(之前默認(rèn)設(shè)置)。
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;
最后,這就是訓(xùn)練階段?,F(xiàn)在僅需要在訓(xùn)練集上進(jìn)行會話設(shè)置后從外部進(jìn)行迭代執(zhí)行。外部的執(zhí)行取決于訓(xùn)練方法是否返回?fù)p失。
推斷階段
最后一個階段是推斷階段,該階段使用測試集來驗證訓(xùn)練算法的性能。輸入是背景顏色中的 RGB 顏色,輸出是算法為字體顏色是黑是白進(jìn)行的 [ 0, 1 ] 或 [ 1, 0 ] 分類預(yù)測。由于輸入數(shù)據(jù)點經(jīng)過歸一化,因此不要忘記在這一步也對顏色進(jìn)行歸一化。
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;
該方法在數(shù)學(xué)環(huán)境中再次運行性能關(guān)鍵部分,需要定義一個映射,該映射最終可作為會話評估的輸入。記住,預(yù)測方法不是一定得在訓(xùn)練階段后運行。它可以在訓(xùn)練階段中使用,來輸出測試集的驗證。至此,神經(jīng)網(wǎng)絡(luò)已經(jīng)經(jīng)歷了設(shè)置、訓(xùn)練和推斷階段。
在 JavaScript 中可視化學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)
現(xiàn)在是時候使用神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練和驗證/測試了。簡單的過程為建立一個神經(jīng)網(wǎng)絡(luò),使用一個訓(xùn)練集運行訓(xùn)練階段,代價函數(shù)取得最小值之后,使用一個測試集進(jìn)行預(yù)測。所有的過程只需要使用網(wǎng)頁瀏覽器上的開發(fā)者控制臺的幾個 console.log statements 就可以完成。然而,由于該神經(jīng)網(wǎng)絡(luò)是關(guān)于顏色預(yù)測的,并且 deeplearn.js 是在瀏覽器上運行,從而可以輕松地對神經(jīng)網(wǎng)絡(luò)的訓(xùn)練階段和測試階段進(jìn)行可視化。
電子發(fā)燒友App









評論