我沒有構建過大量神經網絡,因此我按照構建神經網絡的一般實踐進行操作。在 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 單元。在我們的案例中,神經網絡默認使用修正線性單元。
評論
查看更多