节气,TensorFlow.js 进行模型练习,不一样的卡梅拉

频道:微博新闻 日期: 浏览:137

1.简介

在此代码框中,您将操练模型以依据描绘一组轿车的数值数据进行猜测。

本操练将演示操练许多不同类型模型的常用进程,但将运用小数据集和简略(浅)模型。首要意图是协助您了解TensorFlow.js操练模型的根本术语,概节气,TensorFlow.js 进行模型操练,不一样的卡梅拉念和语法,并为进一步探究和学习供给垫脚石。

由于咱们正在操练模型来猜测接连数字,所以此使命有时被称为回归使命。咱们将经过展现输入的许多示例以及正确的输出来操练模型。这被称为监督学习

你将树立什么

您将创立一个运用TensorFlow.js在浏览器中操练模型的网页。考虑到轿车的“马力”,该模型将学习猜测“每加仑英里数”(MPG)。

为此,您将:

  • 加载数据并预备进行操练。

  • 界说模型的体系结构。

  • 操练模型节气,TensorFlow.js 进行模型操练,不一样的卡梅拉并监控其操练时的体现。

  • 经过做出一些猜测来评价操练的模型。

你会学到什么

  • 机器学习数sk据预备的最佳实践,包含改组和规范化。

  • TensorFlow.js运用tf.layers API创立模型的语法。

  • 怎么运用tfjs-vis库监控浏览器内操练。

你需求什么

  • 最新版别的Chrome或其他现代浏览器。

  • 一个文本编辑器,能够在您的机器上本地运转,也能够经过CodepenGlitch等在Web上运转。

  • 了解HTML,CSS,JavaScript和Chrome DevTools(或您首选的浏览器开发工具)。

  • 对神经网络的高档概念性了解。假如您需求介绍或温习,请考虑经过3blue1brown观看此视频或观看由Ashi Krishnan在Javascript中进行深度学习的视频

背部

2.设置好

创立一个HTML页面并包含JavaScript

index.html
<!DOCTYPE html&g岳兰若t;<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>

为代码创立JavaScript文件

  1. 在与上面的HTML文件相同的文件夹中,创立一个名为script.js的文件,并将以下代码放入其间。

console.log('Hello TensorFlow');

留意:假如您在CodeLab自助服务终端,咱们建议您运用glitch.com来完结此codelab。咱们现已为您设置了一个发动项目来从头加载tensorflow.js。

留意:这些设置阐明(以及本教程的其他部分)侧重于经过脚本符号加载文件。许多JavaScript开发人员更喜爱运用npm来装置依靠项和绑缚包来构建他们的项目。假如是你,你也能够从NPM 装置te京张高铁nsorflow.jstfjs-vis

测验一下

现在您现已创立了HTML和JavaScript文件,请测验它们。在浏览器中翻开index.html文件并翻开devtools操控台。

假如全部正常,则应该在devtools操控台中创立并供给两个全celebrate局变量:

tf
tfvis
Hello TensorFlow

背部

3.加载,格式化和可视化输入数据

作为第一步问天阙,让咱们加载,格式化和可视化咱们想要操练模型的数据。

咱们将从咱们为您保管的JSON文件中加载“cars”数据集。它包含有关每辆车的许多不同功用。关于本教程,咱们只想提取有关Horsepower和Miles Per Gallon的数据。

script.js
/**
* Get the car data reduced to just the variables we are interested
* and cleaned of missing data.
*/
async function getData() {
const carsDataReq = await fetch('https://storage.googleapis.com/tfjs-tutorials/carsData.json');
const carsData =大月熏 await carsDataReq.json();
const cleaned = carsData.map(car => ({
mpg: car.M节气,TensorFlow.js 进行模型操练,不一样的卡梅拉iles_per_Gallon,
horsepower: car.Horsepower,
}))
.filter(car => (car.mpg != null && car.horsepower != null));

return cleaned;
}

这也将删去任何没有界说每加仑英里数或马力的条目。咱们还在散点图中制造这些数据以查看它的外观。

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.horsepower,
y: d.mpg,
}));

tfvis.render.scatterplot(
{name: 'Horsepower v MPG'},
{values},
{
xLabel: 'Horsepower',
yLabel: 'MPG',
height: 300
}
);

// More code will be added below
}

document.addEventListener('DOMContentLoaded', run);

改写页面时。您应该在页面左边看到一个面板,其间包含数据的散点图。看起来应该是这样的。

该面板称为遮阳板,由tfjs-vis供给。它供给了显现可视化的便当方位。

carsData

从上图能够看出,马力与MPG之间存在负相关联系,即转基因跟着马力上升,轿车每加仑行进路程一般会削减。

记住:假如数据中没有结构(形式)(即数据是随机的),模型将无法真实学到任何东西。

概念化咱们的使命

咱们的输入数据现在看起来像这样。

...
{
"mpg":15,
"horsepower":165,
},
{
"mpg":18,
"horsepower":150,
},
{
"mpg":16,
"horsepower":150,
},
...

咱们的方针是操练一个模型,该模型将选用一个数字,马力并学习猜测一个数字,每加仑英里数。请记住一对一映射,由于它对下一节很重要。

咱们将把这些比如,马力和MPG供给给一个神经网络,该神经网络将从这些比如中学习一个公式(或函数)来猜测给定马力hdmi接口的MPG。从咱们得到正确答案的示例中学习称为监督学习

背部

4.界说模型体系结构

在本节中,咱们将编写代码来描绘模型体系结构。模型体系结构仅仅一种说法“模型在履行时将运转哪些函数”,或许“咱们的模型将运用什么算法来核算其答案”的独特方法。

ML模型是选用输入并发作输出的算法。当运用神经网络时,算法是一组神经元,其权重(数字)操控着它们的输出。操练进程学习这些权重的抱负值。

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();
sequential

增加图层

model.add(tf.layers.dense({inputShape: [1], units: 1, useBias: true}));
1
units
tf.layers.de旭辉研彩软件nse
model.add(tf.layers.dense({units: 1}));
1

留意:在这个比如中,由于躲藏层有1个单元,咱们实际上并不需求在上面增加终究输出层(即咱们能够运用躲藏层作为输出层)。可是,界说独自的输出层答应咱们修正躲藏层中的单元数,一同坚持输入和输出的一对一映射。

创立一个实例

run
// Create the model
const model = createModel();
tfvis.show.modelSummary({name: 'Model Summary'}, model);

这将创立模型的节气,TensorFlow.js 进行模型操练,不一样的卡梅拉实例,并在网页上显现图层的摘要。

背部

5.预备操练数据

为了取得使操练机器学习模型切实可行的TensorFlow.js的功用优势,咱们需求将数据转化为张量。咱们还将对咱们的数据进行一些最佳实践转化,即改组规范化

script.js
/** * Convert the input data to a tensors that we can use for machine  * learning. We will also do the important best practices of _shuffling_ * the data and _normalizing_ the data * MPG on the y-axis. */function convertToTensor(data) {  // Wrapping these calculations in a tidy will dispose any   // intermediate tensors.    return tf.tidy(() => {    // Step 1. Shuffle the data        tf.util.shuffle(data);    // Step 2. Convert data to Tensor    const inputs = data.map(d => d.horsepower)    const labels = data.map(d => d.mpg);    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).div(inputMax.sub(inputMin));    const normalizedLabels = labelTensor.sub(labelMin).div(labelMax.sub(labelMin));    return {      inputs: normalizedInputs,      labels: normalizedLabels,      // Return the min/max bounds so we can use them later.      inputMax,      inputMin,      labelMax,      labelMin,    }  });  }

让咱们分化这儿发作的工作。

随机播映数据

// Step 1. Shuffle the data    tf.util.shuffle(data);

在这儿,咱们将咱们将供给给操练算法的示例的次序随机化。改组很重要,由于一般在操练期间,数据集被分化为较小的子集,称为批处理,模型是在操练中进行的。混洗有助于每批产品具有来自整个数据散布的各种数据。经过这样做咱们协助模型:

  • 不学习朴实依靠于数据输入次序的东西

  • 对子组中的结构不灵敏(例如,假如它只在操练的前半部分看到高马力轿车,它可能会学习一种不适用于其他数据集的联系)。

最佳实践1:在将数据交给TensorFlow.js中的操练算法之前,您应一直将数据洗牌

转化为张量

// Step 2. Convert data to Tensorconst inputs = data.map(d => d.horsepower)const labels = data.map(d => d.mpg);const inputTensor = tf.tensor2d(inputs, [inputs.length, 1]);const labelTensor = tf.tensor2d(labels, [labels.length, 1]);

这儿咱们制造两个数组,一个用于咱们的输入示例(马力条目),另一个用于真实的输出值(在机器学习中称为标签)。

1

规范化数据

//Step 3. Normalize the data to the range 0 - 1 using min-max scalingconst inputMax = inputTensor.max();const inputMin = inputTensor.min();  const labelMax = labelTensor.max();const labelMin = labelTensor.min();const normalizedInputs = inputTensor.sub(inputMin).div(inputMax.sub(inputMin));const normalizedLabels = labelTensor.sub(labelMin).div(labelMax.sub(labelMin));
-1 to 1

最佳实践2:您应该一直考虑在操练之前规范化您的数据。有些数据集能够在没有规范化的情况下学习,可是对数据进行规范化一般会消除一系列阻碍有用学习的问题。

您能够在将数据转化为张量之前对其进行规范化。咱们之后会这样做,由于咱们能够运用TensorFlow.js中的向量化来履行最小 - 最大缩放操作,而无需编写任何显式的for循环。

回来数据和规范化鸿沟

return {  inputs: normalizedInputs,  labels: normalizedLabels,  // Return the min/max bounds so we can use them later.  inputMax,  inputMin,  labelMax,  lab扫地机器人elMin,}

咱们期望保存操练期间用于归一化的值,以便咱们能够对输出进行非规范化,使其康复到原始份额,并答应咱们以相同的方法规范化未来的输入数据。

背部

6.操练模挠男孩型

经过创立咱们的模型实例并将咱们的数据表明为张量,咱们具有全部能够开端操练的进程。

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;    retur和合尚善n await model.fit(inputs, labels, {    batc爱宅hSize,    epochs,    shuffle: true,    callbacks: tfvis.show.fitCallbacks(      { name: 'Training Performance' },      ['loss', 'mse节气,TensorFlow.js 进行模型操练,不一样的卡梅拉'],       { height: 200, callbacks: ['onEpochEnd'] }    )  });}

让咱们打破这个。

预备操练

// Prepare the model for training.  model.compile({  optimizer: tf.train.adam(),  loss: tf.losses.meanSquaredError});

咱们有必要在操练之节气,TensorFlow.js 进行模型操练,不一样的卡梅拉前“编译”模型。为此,咱们有必要指定一些非常重要的工作:青鱼

optimizer
meanSquaredError
const batchSize = 32;const epochs = 50;

接下来咱们挑选一个batchSize和一些时期:

batchSize
epochs

开端火车循环

return model.fit(inputs, labels, {  batchSize,  节气,TensorFlow.js 进行模型操练,不一样的卡梅拉epochs,  callbacks: tfvis.show.fitCallbacks(    { name: 'Training Performance' },    ['loss'],     {       height: 200,       callbacks: ['onEpochEnd']    }  )});
model.fit
tfvis.show.fitCallbacks

把它们放在一同

run
run
// 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');

改写页面后,几秒钟后您会看到低烧怎么办以下图表更新。

这些是由咱们之前创立的回调创立的。它们显现了在每个年代结束时在整个数据集上均匀的丢失和mse。

在操练模型时,咱们期望看到丢失下降。在这种情况下,由于咱们的目标是衡量过错的目标,所以咱们期望它也会下降。

假如您想了解操练期间暗地发作的工作。阅览咱们的攻略或观看3blue1brown的视频

背部

7.做出猜测

现在咱们的模型现已过操练,咱们想做一些猜测。让咱们经过调查它对低马力到高马力的均匀数量规模的猜测来评价模型。

将以下函数增加到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.horsepower, y: d.mpg,
}));


tfvis.render.scatterplot(
{name: 'Model Predictions vs Original Data'},
{values: [originalPoints, predictedPoints], series: ['original', '徐翔predicted']},
{
xLabel: 'Horsepower',
yLabel: 'MPG',
height: 300
}
);
}

在上面的函数中需求留意的一些事项。

const xs = tf.linspace(0, 1, 100);      
const preds = model.predict(xs.reshape([100, 1]));
[num_examples, num_features_per_example]
// Un-normalize the data
const unNormXs = xs
.mul(inputMax.sub(inputMin))
.add(inputMin);

const unNormPreds = preds
.mul(labelMax.sub(labelMin))
.add(labelMin);

为了将数据康复到咱们的原始规模(而不是0-1),咱们运用在规范化时核算的值,但仅仅回转操作。

return [unNormXs.dataSync(), unNormPreds.dataSync()];
.data()

终究,咱们运用tfjs-vis制造原始数据和模型的猜测。

run
// Make some predictions using the model and compare them to the
// original data
testModel(model, data, tensorData);

改写页面,一旦模型完结操练,您应该看到相似下面的内容。

祝贺!您刚刚操练了一个简略的机器学习模型。它现在履行所谓的线性回归,它企图使输入数据中存在的趋势契合线。

背部

8.首要外卖

操练机器学习模型的进程包含:

拟定你的使命:

  • 它是回归问题仍是分类问题?

  • 这能够经过有监督的学习或无监督学习来完结吗?

  • 输入数据的形状是什么?输出数据应该是什么样的?

预备您的数据:

  • 整理数据并尽可能手动查看数据

  • 在将数据用于操练之前对其进行随机播映

  • 将数据规范化为神经网络的合理规模。一般0-1或-1-1是数值数据的杰出规模。

  • 将您的数据转化为张量

构建并运转您的模型:

tf.layers.*
  • 挑选一个优化器(adam一般很好),以及批量巨细和时期数等参数。

meanSquaredError
  • 监控操练,看看丢失是否会下降

评价您的模型

  • 挑选您能够在操练时监控的模型评价目标。一旦经过操练,测验进行一些测验猜测,以取得猜测质量感。

背部

9.额定信誉:要测验的工作

  • 试验改变了年代的数量。在图表变平之前,您需求多少个历元。

  • 测验增加躲藏层中的单位数。

  • 测验咱们增加的第一个躲藏层和终究输出层之间增加更多躲藏层。这些额定图层的代码应如下所示。

model.add(tf.layers.dense({units: 50, activation: 'sigmoid'}));

关于这些躲藏层的最重要的新事物是它们引入了非线性激活函数,在这种情况下是sigmoid激活。要了解有关激活功用的更多信息,请参阅此文章

看看你是否能够让模型生成输出,如下图所示。

背部


热门
最新
推荐
标签