使用 ml5.js 在 JavaScript 中实现的机器学习

介绍
我很高兴 JavaScript 中出现了机器学习的实现。它抽象化了训练和使用机器学习模型相关的许多复杂性。我只希望ml5.js不会在明天或下个月就过时!Python 已经成为了 #machinelearning 的现代主流语言。而且有大量的 Python 库可以实现机器学习任务。然而,JavaScript 的机器学习实现才刚刚起步。
我选择 ml5.js 作为我的“美少女战士姿势登录/登录”项目的启动脚本,因为您只需通过 CDN 引用该库即可使用其内置方法。这与引用其他库(例如 JQuery)类似。无需安装。
在项目中包含 ml5.js
<head>
<script src="https://unpkg.com/ml5@0.1.1/dist/ml5.min.js">
</script>
</head>
ml5.js
ml5.js是一个基于浏览器的 tensorflow.js 封装器。它自称是“面向 Web 的友好型机器学习”。ml5.js在浏览器中提供预训练模型。如果您尝试从零开始进行机器学习,您可能会自行训练模型。例如,将大量输入(例如人体姿势)输入到神经网络中。随着时间的推移,神经网络会通过接收模拟/大量输入变得足够复杂,从而能够通过识别模式给出可预测、可理解的输出。这类似于大脑中的突触,随着时间的推移,突触会随着反复刺激而得到强化。本文将从技术层面进一步阐述。
用于对图像进行分类的预训练模型(例如 MobileNet)与 ml5.js 一起使用,通过将其作为参数传递给对象ml5.ImageClassifier()
的方法ml5
以及回调函数:
ml5.imageClassifier(MobileNet,callbackFunction);
MobileNet 模型已使用 1500 万张图像进行训练,因此您可以想象使用预先训练好的模型比自行创建模型更有用。Ml5.js 在云端引用了此库,因此您可以在自己的项目中使用它。
可供您与 ml5.js 一起使用的一些其他预训练模型包括:
- PoseNet(用于检测姿势)
- BodyPix
- 人脸API
- YOLO
- 以及其他
使用 ml5.js 时,需要注意的是:“ml5.js 在所有方法中都支持错误优先回调和 Promises。” 让我们来分析一下:
- 错误优先回调
- 承诺
错误第一次回调
回调函数是指在另一个函数执行完成后执行的函数,也称为回调函数。在 JavaScript 中,函数是一个对象。这意味着你可以将一个函数作为参数传递给另一个函数。接收回调函数作为参数的函数被称为高阶函数。
通过使用回调函数,可以确保回调函数中包含的代码块在其父函数运行之前不会执行。这种想法有助于我们创建异步代码/应用程序。
如果您想练习/了解有关回调的更多信息,请阅读此工作表:
常见的语法/示例是:
function main(argument1, callbackFxn(){
}
}//end of main function
或者您可以引用命名回调函数:
function main(argument1, hello());
ml5.js 使用错误优先回调模式来处理异步操作。回调函数将在异步操作结束后执行,并且第一个参数为错误对象。代码如下:
ml5.methodName(ModelName, function(errorObj, someData)
{if(errorObj){
//Error executes first
}
//some Data is returned from the pre-trained model
});
如果没有发生错误,则errorObj
对象被设置为空并返回一些数据。
承诺
JavaScript 中的 Promise 用于处理异步操作。它们是指向未来接收值的对象。Promise 是作为 ES6 规范的一部分引入的。正如您上面所读到的,异步操作可以通过回调函数完成。然而,多个回调函数的嵌套会造成混乱,并可能导致所谓的回调地狱。这种逻辑结构的目的是,如果将来某个条件满足,则运行一个函数。Promise 有三种状态:
- 待定(承诺状态正在进行中)
- 已解决(承诺成功)
- 被拒绝(承诺未成功)
构建承诺
使用 Promise 构造函数创建一个新的 Promise。Promise 将以回调函数作为参数,并向该函数传递两个参数:
let goodnight = new Promise(function(resolve, reject){
});
传递给promise对象的回调函数goodnight
称为执行器。resolve
是reject
根据结果执行的函数。
例子:
let time = new Date().getHours();
let goodnight = new Promise(function(resolve, reject){
if(time >= 20){
resolve();
}else{
reject();
}
});
如果条件满足,则结果将被传递给执行的 resolve 函数,否则将执行以错误对象作为参数的拒绝函数。
resolve() 和 rejection() 函数不会立即执行。为了处理回调函数返回的 true/false 结果,我们使用 .then() 和 .catch() 方法。
然后抓住
goodnight
.then(function(){
alert('Goodnight')
})
.catch(function(){
alert('Not bedtime')
})
方法是与对象关联的函数。由于 Promise 是对象,我们可以将 .then() 和 .catch() 方法附加到新创建的goodnight
对象上。这些方法会执行某些操作。如果时间 >= 晚上 8 点,则其中的匿名回调函数then
会提示“晚安”。否则,会提示“非就寝时间”。
返回 ml5.js
回到前面提到的 ml5.js,它提供了对各种图像、视频、声音和文本机器学习预训练模型的访问。你可以在左侧导航栏中看到大部分模型。
每个预先训练的模型都带有:
- 参数:在预训练模型初始化期间传递。预训练模型的名称是必需的。例如,MobileNet、PoseNet。其他参数(例如回调函数、视频、图像等)是可选的,取决于您选择的模型。
- 属性:这些是可选的
- 方法:这些方法用于处理数据,例如,detect() 将检测人脸。PoseNet 模型使用事件处理方法来检测新的姿势。on(pose,callbackFxn)
要使用它们:
- 初始化预训练模型:
let posenet = ml5.nameOfMethod(nameOfPreTrainedModel,callbackFxn)
- 定义回调函数:
function callbackFxn(){
console.log('model loaded successfully')
}
- 使用#1中的变量引用的模型来做一些事情:
poseNet.on('pose', function(results){
//do something with the results
pose1 = results;
});
回调函数被传递给方法,以便我们可以对收到的结果/数据做一些事情。
鏂囩珷鏉ユ簮锛�https://dev.to/kauresss/javascript-implementation-of-machine-learning-with-ml5-js-for-newbies-3kfp