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