所谓机器学习, 就是将已知对应结果的输入数据和对应结果 提交到 TensorFlow 模型中, 以训练模型. 这一步就是机器学习的过程.
训练完成后, 我们传入尚不知晓结果的输入数据 给模型, 模型就能预言结果是什么. 这一步就是 AI 的应用.
举个例子, 现有澳门赌场性感荷官在线投骰子, 已经投了 4 次:
第一次的结果是 1 点,
第二次的结果是 3 点,
第三次的结果是 5 点,
第四次的结果是 7 点.
最多几个点不是重点.
重点来了, 让模型能预测第五次是几点.
你可能一眼就看出来了规律, 甚至提炼出了可套用的公式 (函数): 结果 = 2n-1.
但是如果写套用公式的程序, 那就不是编写 AI 了.
事实上, 我们对模型的训练, 就是为了让模型推导出那个公式, 而不是让程序员推导出, 然后写死.
我们对模型调教的越多, 模型推导出的公式就越趋近于正确.
写到这里, 可以总结一点: 对模型的训练, 就是让模型从数据中找出公式 (函数).
有了这个函数, 就能输入数据, 返回结果.
CODING
现在我们以投骰子的例子, 来写出相关代码.
首先全局安装 Parcel https://parceljs.org/getting_started.html .
npm init 一个项目.
然后安装 TensorFlow:
npm install @tensorflow/tfjs --save
新建 index.html 和 1.js 文件, 并在 index.html 中引入 1.js.
运行 parcel index.html 启动项目.
下面开始在 1.js 中编写演示代码了:
- // 引入 TensorFlow
- import * as tf from '@tensorflow/tfjs'
- // 定义线性衰退模型
- const model = tf.sequential()
- // add 方法添加一个图层实例
- // tf.layers.dense 创建一个输入输出维度为 1 的层
- model.add(tf.layers.dense({ units: 1, inputShape: [1] }))
- // 指定损失函数和优化器
- model.compile({ loss: 'meanSquaredError', optimizer: 'sgd' })
- // 模拟一些数据用以训练
- // xs 代表投骰子的第几次
- // tensor2d 方法定义一个 4 行 1 列的二维张量
- // xs 代表投骰子的第几次
- const xs = tf.tensor2d([1, 2, 3, 4], [4, 1])
- // ys 代表每一次骰子的结果
- const ys = tf.tensor2d([1, 3, 5, 7], [4, 1])
- // 训练模型
- async function train() {
- // for 循环增加训练次数, 训练的越多, 预测的越准
- for (let index = 0; index < 30; index++) {
- // fit 方法训练模型, epochs 表示迭代训练数组的次数
- await model.fit(xs, ys, { epochs: 10 })
- }
- // 训练完成, 现在我们要预测第 5 次是几点
- // predict 方法用以预测, 相当于调用机器推导出的公式, 传入一个 b 表示第 5 次的 1 行 1 列张量
- // print 方法打印结果到控制台
- model.predict(tf.tensor2d([5], [1, 1])).print()
- }
- train()
- OK!
在浏览器控制台我们就能看到以上代码的执行结果了:
- Tensor
- [[8.7086086],]
预测结果为 8.7086086, 和正确结果 9 相差 0.3 左右.
如果我们调整代码, 增加 10 倍训练次数:
for (let index = 0; index < 300; index++)
再来看看结果:
- Tensor
- [[8.9998331],]
已经很接近 9 了!
到这里, 我们已经接触到了 AI 的一些皮毛了.
来源: https://juejin.im/entry/5b597b3af265da0fa959c009