我沒有構建過大量神經(jīng)網(wǎng)絡,因此我按照構建神經(jīng)網(wǎng)絡的一般實踐進行操作。在 JavaScript 中,你可以使用 JavaScript ES6 class 來推進它。該類可以通過定義神經(jīng)網(wǎng)絡特性和類方法為你的神經(jīng)網(wǎng)絡提供完美的容器。例如,你的顏色歸一化函數(shù)可以在類別中找到一個作為方法的點。
class ColorAccessibilityModel {
normalizeColor(rgb) {
return rgb.map(v => v / 255);
}
}
export default ColorAccessibilityModel;
或許那也是你的函數(shù)生成數(shù)據(jù)集的地方。在我的案例中,我僅將類別歸一化作為分類方法,讓數(shù)據(jù)集生成獨立于類別之外。你可以認為未來有不同的方法來生成數(shù)據(jù)集,不應該在神經(jīng)網(wǎng)絡模型中進行定義。不管怎樣,這只是一個實現(xiàn)細節(jié)。
訓練和推斷階段都在機器學習的涵蓋性術語會話(session)之下。你可以在神經(jīng)網(wǎng)絡類別中設置會話。首先,你可以輸入來自 deeplearn.js 的 NDArrayMathGPU 類別,幫助你以計算高效的方式在 GPU 上進行數(shù)學運算。
import {
NDArrayMathGPU,
} from 'deeplearn';
const math = new NDArrayMathGPU();
class ColorAccessibilityModel {
...
}
export default ColorAccessibilityModel;
第二,聲明分類方法類設置會話。其函數(shù)簽名使用訓練集作為參數(shù),成為從先前實現(xiàn)的函數(shù)中生成訓練集的完美 consumer。
第三步,會話初始化空的圖。之后,圖將反映神經(jīng)網(wǎng)絡的架構。你可以隨意定義其特性。
import {
Graph,
NDArrayMathGPU,
} from 'deeplearn';
class ColorAccessibilityModel {
setupSession(trainingSet) {
const graph = new Graph();
}
..
}
export default ColorAccessibilityModel;
第四步,你用張量的形式定義圖中輸入和輸出數(shù)據(jù)點的形態(tài)。張量是具備不同維度的數(shù)組,它可以是向量、矩陣,或更高維度的矩陣。神經(jīng)網(wǎng)絡將這些張量作為輸入和輸出。在我們的案例中,有三個輸入單元(每個顏色通道有一個輸入單元)和兩個輸出單元(二分類,如黑白)。
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;
第五步,神經(jīng)網(wǎng)絡包含隱藏層。奇跡如何發(fā)生目前仍是黑箱?;旧希窠?jīng)網(wǎng)絡提出自己的交叉計算參數(shù)(在會話中經(jīng)過訓練)。不過,你可以隨意定義隱藏層的維度(每個單元大小、層大小)。
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;
根據(jù)層的數(shù)量,你可以變更圖來擴展出更多層。創(chuàng)建連接層的分類方法需要圖、變異連接層(mutated connected layer)、新層的索引,以及單元數(shù)量。圖的層屬性可用于返回由名稱確定的新張量。
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;
神經(jīng)網(wǎng)絡中的每一個神經(jīng)元必須具備一個定義好的激活函數(shù)。它可以是 logistic 激活函數(shù)。你或許已經(jīng)從 logistic 回歸中了解到它,它成為神經(jīng)網(wǎng)絡中的 logistic 單元。在我們的案例中,神經(jīng)網(wǎng)絡默認使用修正線性單元。
評論