? ? ? ? 機器學習中的訓練集由輸入數(shù)據(jù)點和輸出數(shù)據(jù)點(標簽)組成。它被用來訓練為訓練集(例如測試集)之外的新輸入數(shù)據(jù)點預(yù)測輸出的算法。在訓練階段,由神經(jīng)網(wǎng)絡(luò)訓練的算法調(diào)整其權(quán)重以預(yù)測輸入數(shù)據(jù)點的給定標簽。總之,已訓練算法是一個以數(shù)據(jù)點作為輸入并近似輸出標簽的函數(shù)。
? ? ? ?該算法經(jīng)過神經(jīng)網(wǎng)絡(luò)的訓練后,可以為不屬于訓練集的新背景顏色輸出字體顏色。因此,稍后你將使用測試集來驗證訓練算法的準確率。由于我們正在處理顏色,因此為神經(jīng)網(wǎng)絡(luò)生成輸入顏色的樣本數(shù)據(jù)集并不困難。
function generateRandomRgbColors(m) {
const rawInputs = [];
for (let i = 0; i < m; i++) {
rawInputs.push(generateRandomRgbColor());
}
return rawInputs;
}
function generateRandomRgbColor() {
return [
randomIntFromInterval(0, 255),
randomIntFromInterval(0, 255),
randomIntFromInterval(0, 255),
];
}
function randomIntFromInterval(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
generateRandomRgbColors() 函數(shù)創(chuàng)建給定大小為 m 的部分數(shù)據(jù)集。數(shù)據(jù)集中的數(shù)據(jù)點是 RGB 顏色空間中的顏色。每種顏色在矩陣中被表征為一行,而每一列是顏色的特征。特征是 RGB 空間中的 R、G、B 編碼值。數(shù)據(jù)集還沒有任何標簽,所以訓練集并不完整,因為它只有輸入值而沒有輸出值。
由于基于已知顏色生成可使用字體顏色的編程方法是已知的,因此可以使用調(diào)整后的功能版本以生成訓練集(以及稍后的測試集)的標簽。這些標簽針對二分類問題進行了調(diào)整,并在 RGB 空間中隱含地反映了黑白的顏色。因此,對于黑色,標簽是 [0,1];對于白色,標簽是 [1,0]。
function getAccessibleColor(rgb) {
let [ r, g, b ] = rgb;
let color = [r / 255, g / 255, b / 255];
let c = color.map((col) => {
if (col <= 0.03928) {
return col / 12.92;
}
return Math.pow((col + 0.055) / 1.055, 2.4);
});
let L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);
return (L > 0.179)
? [ 0, 1 ] // black
: [ 1, 0 ]; // white
}
現(xiàn)在你已經(jīng)準備好一切用于生成(背景)顏色的隨機數(shù)據(jù)集(訓練集、測試集),它被分類為黑色或白色(字體)顏色。
function generateColorSet(m) {
const rawInputs = generateRandomRgbColors(m);
const rawTargets = rawInputs.map(getAccessibleColor);
return { rawInputs, rawTargets };
}
使神經(jīng)網(wǎng)絡(luò)中底層算法更好的另一步操作是特征縮放。在特征縮放的簡化版本中,你希望 RGB 通道的值在 0 和 1 之間。由于你知道最大值,因此可以簡單地推導出每個顏色通道的歸一化值。
function normalizeColor(rgb) {
return rgb.map(v => v / 255);
}
你可以把這個功能放在你的神經(jīng)網(wǎng)絡(luò)模型中,或者作為單獨的效用函數(shù)。下一步我將把它放在神經(jīng)網(wǎng)絡(luò)模型中。
JavaScript 神經(jīng)網(wǎng)絡(luò)模型的設(shè)置階段
現(xiàn)在你可以使用 JavaScript 實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)了。在開始之前,你需要先安裝 deeplearn.js 庫:一個適合 JavaScript 神經(jīng)網(wǎng)絡(luò)的框架。官方宣傳中說:「deeplearn.js 是一個開源庫,將高效的機器學習構(gòu)造塊帶到 web 中,允許在瀏覽器中訓練神經(jīng)網(wǎng)絡(luò)或在推斷模式下運行預(yù)訓練模型。」本文,你將訓練自己的模型,然后在推斷模式中運行該模型。使用該庫有兩個主要優(yōu)勢:
首先,它使用本地電腦的 GPU 加速機器學習算法中的向量計算。這些機器學習計算與圖解計算類似,因此使用 GPU 的計算比使用 CPU 更加高效。
其次,deeplearn.js 的結(jié)構(gòu)與流行的 TensorFlow 庫類似(TensorFlow 庫也是谷歌開發(fā)的,不過它使用的是 Python 語言)。因此如果你想在使用 Python 的機器學習中實現(xiàn)飛躍,那么 deeplearn.js 可提供通向 JavaScript 各領(lǐng)域的捷徑。
現(xiàn)在回到你的項目。如果你想用 npm 來設(shè)置,那么你只需要在命令行中安裝 deeplearn.js。也可以查看 deeplearn.js 項目的官方安裝說明文檔。
npm install deeplearn
評論
查看更多