我没有构建过大量神经网络,因此我按照构建神经网络的一般实践进行操作。在 JavaScript 中,你可以使用 JavaScript ES6 class 来推进它。该类可以通过定义神经网络特性和类方法为你的神经网络提供完美的容器。例如,你的颜色归一化函数可以在类别中找到一个作为方法的点。
class ColorAccessibilityModel {
normalizeColor(rgb) {
return rgb.map(v => v / 255);
}
}
export default ColorAccessibilityModel;
或许那也是你的函数生成数据集的地方。在我的案例中,我仅将类别归一化作为分类方法,让数据集生成独立于类别之外。你可以认为未来有不同的方法来生成数据集,不应该在神经网络模型中进行定义。不管怎样,这只是一个实现细节。
训练和推断阶段都在机器学习的涵盖性术语会话(session)之下。你可以在神经网络类别中设置会话。首先,你可以输入来自 deeplearn.js 的 NDArrayMathGPU 类别,帮助你以计算高效的方式在 GPU 上进行数学运算。
import {
NDArrayMathGPU,
} from 'deeplearn';
const math = new NDArrayMathGPU();
class ColorAccessibilityModel {
...
}
export default ColorAccessibilityModel;
第二,声明分类方法类设置会话。其函数签名使用训练集作为参数,成为从先前实现的函数中生成训练集的完美 consumer。
第三步,会话初始化空的图。之后,图将反映神经网络的架构。你可以随意定义其特性。
import {
Graph,
NDArrayMathGPU,
} from 'deeplearn';
class ColorAccessibilityModel {
setupSession(trainingSet) {
const graph = new Graph();
}
..
}
export default ColorAccessibilityModel;
第四步,你用张量的形式定义图中输入和输出数据点的形态。张量是具备不同维度的数组,它可以是向量、矩阵,或更高维度的矩阵。神经网络将这些张量作为输入和输出。在我们的案例中,有三个输入单元(每个颜色通道有一个输入单元)和两个输出单元(二分类,如黑白)。
class ColorAccessibilityModel {
inputTensor;
targetTensor;
setupSession(trainingSet) {
const graph = new Graph();
this.inputTensor = graph.placeholder('input RGB value', [3]);
this.targetTensor = graph.placeholder('output classifier', [2]);
}
...
}
export default ColorAccessibilityModel;
第五步,神经网络包含隐藏层。奇迹如何发生目前仍是黑箱。基本上,神经网络提出自己的交叉计算参数(在会话中经过训练)。不过,你可以随意定义隐藏层的维度(每个单元大小、层大小)。
class ColorAccessibilityModel {
inputTensor;
targetTensor;
setupSession(trainingSet) {
const graph = new Graph();
this.inputTensor = graph.placeholder('input RGB value', [3]);
this.targetTensor = graph.placeholder('output classifier', [2]);
let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);
connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);
connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);
}
createConnectedLayer(
graph,
inputLayer,
layerIndex,
units,
) {
...
}
...
}
export default ColorAccessibilityModel;
根据层的数量,你可以变更图来扩展出更多层。创建连接层的分类方法需要图、变异连接层(mutated connected layer)、新层的索引,以及单元数量。图的层属性可用于返回由名称确定的新张量。
class ColorAccessibilityModel {
inputTensor;
targetTensor;
setupSession(trainingSet) {
const graph = new Graph();
this.inputTensor = graph.placeholder('input RGB value', [3]);
this.targetTensor = graph.placeholder('output classifier', [2]);
let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);
connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);
connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);
}
createConnectedLayer(
graph,
inputLayer,
layerIndex,
units,
) {
return graph.layers.dense(
`fully_connected_${layerIndex}`,
inputLayer,
units
);
}
...
}
export default ColorAccessibilityModel;
神经网络中的每一个神经元必须具备一个定义好的激活函数。它可以是 logistic 激活函数。你或许已经从 logistic 回归中了解到它,它成为神经网络中的 logistic 单元。在我们的案例中,神经网络默认使用修正线性单元。
评论
查看更多