小編給大家分享一下TensorFlow.js中JavaScript機器學習的示例分析,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)-專業(yè)網站定制、快速模板網站建設、高性價比濱江網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式濱江網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋濱江地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。雖然python或r編程語言有一個相對容易的學習曲線,但是Web開發(fā)人員更喜歡在他們舒適的javascript區(qū)域內做事情。目前來看,node.js已經開始向每個領域應用javascript,在這一大趨勢下我們需要理解并使用JS進行機器學習。由于可用的軟件包數(shù)量眾多,python變得流行起來,但是JS社區(qū)也緊隨其后。這篇文章會幫助初學者學習如何構建一個簡單的分類器。
我們可以創(chuàng)建一個使用tensorflow.js在瀏覽器中訓練模型的網頁。考慮到房屋的“avgareanumberofrows”,模型可以學習去預測房屋的“價格”。
為此我們要做的是:
加載數(shù)據并為培訓做好準備。
定義模型的體系結構。
訓練模型并在訓練時監(jiān)控其性能。
通過做出一些預測來評估經過訓練的模型。
第一步:讓我們從基礎開始
創(chuàng)建一個HTML頁面并包含JavaScript。將以下代碼復制到名為index.html的HTML文件中。
<!DOCTYPE html> <html> <head> <title>TensorFlow.js Tutorial</title> <!-- Import TensorFlow.js --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script> <!-- Import tfjs-vis --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis@1.0.2/dist/tfjs-vis.umd.min.js"></script> <!-- Import the main script file --> <script src="script.js"></script> </head> <body> </body> </html>
為代碼創(chuàng)建javascript文件
在與上面的HTML文件相同的文件夾中,創(chuàng)建一個名為script.js的文件,并將以下代碼放入其中。
console.log('Hello TensorFlow');測試
既然已經創(chuàng)建了HTML和JavaScript文件,那么就測試一下它們。在瀏覽器中打開index.html文件并打開devtools控制臺。
如果一切正常,那么應該在devtools控制臺中創(chuàng)建并可用兩個全局變量:
現(xiàn)在你應該可以看到一條消息,上面寫著“Hello TensorFlow”。如果是這樣,你就可以繼續(xù)下一步了。

注意:可以使用Bit來共享可重用的JS代碼
Bit(GitHub上的Bit)是跨項目和應用程序共享可重用JavaScript代碼的最快和最可擴展的方式。可以試一試,它是免費的:
組件發(fā)現(xiàn)與協(xié)作·Bit
Bit是開發(fā)人員共享組件和協(xié)作,共同構建令人驚嘆的軟件的地方。發(fā)現(xiàn)共享的組件…
Bit.dev
例如:Ramda用作共享組件
Ramda by Ramda·Bit
一個用于JavaScript程序員的實用函數(shù)庫。-256個javascript組件。例如:等號,乘…
Bit.dev
第2步:加載數(shù)據,格式化數(shù)據并可視化輸入數(shù)據
我們將加載“house”數(shù)據集,可以在這里找到。它包含了特定房子的許多不同特征。對于本教程,我們只需要有關房間平均面積和每套房子價格的數(shù)據。
將以下代碼添加到script.js文件中。
async function getData() {
Const houseDataReq=await
fetch('https://raw.githubusercontent.com/meetnandu05/ml1/master/house.json');
const houseData = await houseDataReq.json();
const cleaned = houseData.map(house => ({
price: house.Price,
rooms: house.AvgAreaNumberofRooms,
}))
.filter(house => (house.price != null && house.rooms != null));
return cleaned;
}這可以刪除沒有定義價格或房間數(shù)量的任何條目。我們可以將這些數(shù)據繪制成散點圖,看看它是什么樣子的。
將以下代碼添加到script.js文件的底部。
async function run() {
// Load and plot the original input data that we are going to train on.
const data = await getData();
const values = data.map(d => ({
x: d.rooms,
y: d.price,
}));
tfvis.render.scatterplot(
{name: 'No.of rooms v Price'},
{values},
{
xLabel: 'No. of rooms',
yLabel: 'Price',
height: 300
}
);
// More code will be added below
}
document.addEventListener('DOMContentLoaded', run);刷新頁面時,你可以在頁面左側看到一個面板,上面有數(shù)據的散點圖,如下圖。

通常,在處理數(shù)據時,最好找到方法來查看數(shù)據,并在必要時對其進行清理。可視化數(shù)據可以讓我們了解模型是否可以學習數(shù)據的任何結構。
從上面的圖中可以看出,房間數(shù)量與價格之間存在正相關關系,即隨著房間數(shù)量的增加,房屋價格普遍上漲。
第三步:建立待培訓的模型
這一步我們將編寫代碼來構建機器學習模型。模型主要基于此代碼進行架構,所以這是一個比較重要的步驟。機器學習模型接受輸入,然后產生輸出。對于tensorflow.js,我們必須構建神經網絡。
將以下函數(shù)添加到script.js文件中以定義模型。
function createModel() {
// Create a sequential model
const model = tf.sequential();
// Add a single hidden layer
model.add(tf.layers.dense({inputShape: [1], units: 1, useBias: true}));
// Add an output layer
model.add(tf.layers.dense({units: 1, useBias: true}));
return model;
}這是我們可以在tensorflow.js中定義的最簡單的模型之一,我們來試下簡單分解每一行。
實例化模型
const model = tf.sequential();
這將實例化一個tf.model對象。這個模型是連續(xù)的,因為它的輸入直接流向它的輸出。其他類型的模型可以有分支,甚至可以有多個輸入和輸出,但在許多情況下,你的模型是連續(xù)的。
添加層
model.add(tf.layers.dense({inputShape: [1], units: 1, useBias: true}));這為我們的網絡添加了一個隱藏層。因為這是網絡的第一層,所以我們需要定義我們的輸入形狀。輸入形狀是[1],因為我們有1這個數(shù)字作為輸入(給定房間的房間數(shù))。
單位(鏈接)設置權重矩陣在層中的大小。在這里將其設置為1,我們可以說每個數(shù)據輸入特性都有一個權重。
model.add(tf.layers.dense({units: 1}));上面的代碼創(chuàng)建了我們的輸出層。我們將單位設置為1,因為我們要輸出1這個數(shù)字。
創(chuàng)建實例
將以下代碼添加到前面定義的運行函數(shù)中。
// Create the model
const model = createModel();
tfvis.show.modelSummary({name: 'Model Summary'}, model);這樣可以創(chuàng)建實例模型,并且在網頁上有顯示層的摘要。

步驟4:為創(chuàng)建準備數(shù)據
為了獲得TensorFlow.js的性能優(yōu)勢,使培訓機器學習模型實用化,我們需要將數(shù)據轉換為Tensors。
將以下代碼添加到script.js文件中。
function convertToTensor(data) {
return tf.tidy(() => {
// Step 1\. Shuffle the data
tf.util.shuffle(data);
// Step 2\. Convert data to Tensor
const inputs = data.map(d => d.rooms)
const labels = data.map(d => d.price);
const inputTensor = tf.tensor2d(inputs, [inputs.length, 1]);
const labelTensor = tf.tensor2d(labels, [labels.length, 1]);
//Step 3\. Normalize the data to the range 0 - 1 using min-max scaling
const inputMax = inputTensor.max();
const inputMin = inputTensor.min();
const labelMax = labelTensor.max();
const labelMin = labelTensor.min();
const normalizedInputs = inputTensor.sub(inputMin).p(inputMax.sub(inputMin));
const normalizedLabels = labelTensor.sub(labelMin).p(labelMax.sub(labelMin));
return {
inputs: normalizedInputs,
labels: normalizedLabels,
// Return the min/max bounds so we can use them later.
inputMax,
inputMin,
labelMax,
labelMin,
}
});
}接下來,我們可以分析一下將會出現(xiàn)什么情況。
隨機播放數(shù)據
// Step 1\. Shuffle the data tf.util.shuffle(data);
在訓練模型的過程中,數(shù)據集被分成更小的集合,每個集合稱為一個批。然后將這些批次送入模型運行。整理數(shù)據很重要,因為模型不應該一次又一次地得到相同的數(shù)據。如果模型一次又一次地得到相同的數(shù)據,那么模型將無法歸納數(shù)據,并為運行期間收到的輸入提供指定的輸出。洗牌將有助于在每個批次中擁有各種數(shù)據。
轉換為Tensor
// Step 2\. Convert data to Tensor const inputs = data.map(d => d.rooms) const labels = data.map(d => d.price); const inputTensor = tf.tensor2d(inputs, [inputs.length, 1]); const labelTensor = tf.tensor2d(labels, [labels.length, 1]);
這里我們制作了兩個數(shù)組,一個用于輸入示例(房間條目數(shù)),另一個用于實際輸出值(在機器學習中稱為標簽,在我們的例子中是每個房子的價格)。然后我們將每個數(shù)組數(shù)據轉換為一個二維張量。
規(guī)范化數(shù)據
//Step 3\. Normalize the data to the range 0 - 1 using min-max scaling const inputMax = inputTensor.max(); const inputMin = inputTensor.min(); const labelMax = labelTensor.max(); const labelMin = labelTensor.min(); const normalizedInputs = inputTensor.sub(inputMin).p(inputMax.sub(inputMin)); const normalizedLabels = labelTensor.sub(labelMin).p(labelMax.sub(labelMin));
接下來,我們規(guī)范化數(shù)據。在這里,我們使用最小-大比例將數(shù)據規(guī)范化為數(shù)值范圍0-1。規(guī)范化很重要,因為您將使用tensorflow.js構建的許多機器學習模型的內部設計都是為了使用不太大的數(shù)字。規(guī)范化數(shù)據以包括0到1或-1到1的公共范圍。
返回數(shù)據和規(guī)范化界限
return {
inputs: normalizedInputs,
labels: normalizedLabels,
// Return the min/max bounds so we can use them later.
inputMax,
inputMin,
labelMax,
labelMin,
}我們可以在運行期間保留用于標準化的值,這樣我們就可以取消標準化輸出,使其恢復到原始規(guī)模,我們就可以用同樣的方式規(guī)范化未來的輸入數(shù)據。
步驟5:運行模型
通過創(chuàng)建模型實例、將數(shù)據表示為張量,我們可以準備開始運行模型。
將以下函數(shù)復制到script.js文件中。
async function trainModel(model, inputs, labels) {
// Prepare the model for training.
model.compile({
optimizer: tf.train.adam(),
loss: tf.losses.meanSquaredError,
metrics: ['mse'],
});
const batchSize = 28;
const epochs = 50;
return await model.fit(inputs, labels, {
batchSize,
epochs,
shuffle: true,
callbacks: tfvis.show.fitCallbacks(
{ name: 'Training Performance' },
['loss', 'mse'],
{ height: 200, callbacks: ['onEpochEnd'] }
)
});
}我們把它分解一下。
準備運行
// Prepare the model for training.
model.compile({
optimizer: tf.train.adam(),
loss: tf.losses.meanSquaredError,
metrics: ['mse'],
});我們必須在訓練前“編譯”模型。要做到這一點,我們必須明確一些非常重要的事情:
優(yōu)化器:這是一個算法,它可以控制模型的更新,就像上面看到的例子一樣。TensorFlow.js中有許多可用的優(yōu)化器。這里我們選擇了Adam優(yōu)化器,因為它在實踐中非常有效,不需要進行額外配置。
損失函數(shù):這是一個函數(shù),它用于檢測模型所顯示的每個批(數(shù)據子集)方面完成的情況如何。在這里,我們可以使用meansquaredrror將模型所做的預測與真實值進行比較。
度量:這是我們要在每個區(qū)塊結束時用來計算的度量數(shù)組。我們可以用它計算整個訓練集的準確度,這樣我們就可以檢查自己的運行結果了。這里我們使用mse,它是meansquaredrror的簡寫。這是我們用于損失函數(shù)的相同函數(shù),也是回歸任務中常用的函數(shù)。
const batchSize = 28; const epochs = 50;
接下來,我們選擇一個批量大小和一些時間段:
batchSize指的是模型在每次運行迭代時將看到的數(shù)據子集的大小。常見的批量大小通常在32-512之間。對于所有問題來說,并沒有一個真正理想的批量大小,描述各種批量大小的精確方式這一知識點本教程沒有相關講解,對這些有興趣可以通過別的渠道進行了解學習。
epochs指的是模型將查看你提供的整個數(shù)據集的次數(shù)。在這里,我們通過數(shù)據集進行50次迭代。
啟動列車環(huán)路
return model.fit(inputs, labels, {
batchSize,
epochs,
callbacks: tfvis.show.fitCallbacks(
{ name: 'Training Performance' },
['loss', 'mse'],
{
height: 200,
callbacks: ['onEpochEnd']
}
)
});model.fit是我們調用的啟動循環(huán)的函數(shù)。它是一個異步函數(shù),因此我們返回它給我們的特定值,以便調用者可以確定運行結束時間。
為了監(jiān)控運行進度,我們將一些回調傳遞給model.fit。我們使用tfvis.show.fitcallbacks生成函數(shù),這些函數(shù)可以為前面指定的“損失”和“毫秒”度量繪制圖表。
把它們放在一起
現(xiàn)在我們必須調用從運行函數(shù)定義的函數(shù)。
將以下代碼添加到運行函數(shù)的底部。
// Convert the data to a form we can use for training.
const tensorData = convertToTensor(data);
const {inputs, labels} = tensorData;
// Train the model
await trainModel(model, inputs, labels);
console.log('Done Training');刷新頁面時,幾秒鐘后,你應該會看到圖形正在更新。
這些是由我們之前創(chuàng)建的回調創(chuàng)建的。它們在每個時代結束時顯示丟失(在最近的批處理上)和毫秒(在整個數(shù)據集上)。
當訓練一個模型時,我們希望看到損失減少。在這種情況下,因為我們的度量是一個誤差度量,所以我們希望看到它也下降。
第6步:做出預測
既然我們的模型經過了訓練,我們想做一些預測。讓我們通過觀察它預測的低到高數(shù)量房間的統(tǒng)一范圍來評估模型。
將以下函數(shù)添加到script.js文件中
function testModel(model, inputData, normalizationData) {
const {inputMax, inputMin, labelMin, labelMax} = normalizationData;
// Generate predictions for a uniform range of numbers between 0 and 1;
// We un-normalize the data by doing the inverse of the min-max scaling
// that we did earlier.
const [xs, preds] = tf.tidy(() => {
const xs = tf.linspace(0, 1, 100);
const preds = model.predict(xs.reshape([100, 1]));
const unNormXs = xs
.mul(inputMax.sub(inputMin))
.add(inputMin);
const unNormPreds = preds
.mul(labelMax.sub(labelMin))
.add(labelMin);
// Un-normalize the data
return [unNormXs.dataSync(), unNormPreds.dataSync()];
});
const predictedPoints = Array.from(xs).map((val, i) => {
return {x: val, y: preds[i]}
});
const originalPoints = inputData.map(d => ({
x: d.rooms, y: d.price,
}));
tfvis.render.scatterplot(
{name: 'Model Predictions vs Original Data'},
{values: [originalPoints, predictedPoints], series: ['original', 'predicted']},
{
xLabel: 'No. of rooms',
yLabel: 'Price',
height: 300
}
);
}在上面的函數(shù)中需要注意的一些事情。
const xs = tf.linspace(0, 1, 100); const preds = model.predict(xs.reshape([100, 1]));
我們生成100個新的“示例”以提供給模型。model.predict是我們如何將這些示例輸入到模型中的。注意,他們需要有一個類似的形狀([num_的例子,num_的特點每個_的例子])當我們做培訓時。
// Un-normalize the data const unNormXs = xs .mul(inputMax.sub(inputMin)) .add(inputMin); const unNormPreds = preds .mul(labelMax.sub(labelMin)) .add(labelMin);
為了將數(shù)據恢復到原始范圍(而不是0–1),我們使用規(guī)范化時計算的值,但只需反轉操作。
return [unNormXs.dataSync(), unNormPreds.dataSync()];
.datasync()是一種方法,我們可以使用它來獲取存儲在張量中的值的typedarray。這允許我們在常規(guī)的javascript中處理這些值。這是通常選的.data()方法的同步版本。
最后,我們使用tfjs-vis來繪制原始數(shù)據和模型中的預測。
將以下代碼添加到運行函數(shù)中。
testModel(model, data, tensorData);
刷新頁面,現(xiàn)在已經完成啦!
現(xiàn)在你已經學會使用tensorflow.js創(chuàng)建一個簡單的機器學習模型了。
看完了這篇文章,相信你對TensorFlow.js中JavaScript機器學習的示例分析有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文名稱:TensorFlow.js中JavaScript機器學習的示例分析-創(chuàng)新互聯(lián)
分享網址:http://chinadenli.net/article28/coshcp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、品牌網站設計、面包屑導航、外貿網站建設、網站維護、動態(tài)網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)