设置阶段结束后就到了训练阶段了。不需要太多实现,因为所有的基础都已在设置阶段完成。首先,训练阶段可以用分类方法来定义。然后在 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 是在浏览器上运行,从而可以轻松地对神经网络的训练阶段和测试阶段进行可视化。
评论
查看更多