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