在上一篇文章《浏览器中的手写数字识别》中,讲到在浏览器中训练出一个卷积神经网络模型,用来识别手写数字。值得注意的是,这个训练过程是在浏览器中完成的,使用的是客户端的资源。

虽然TensorFlow.js的愿景是机器学习无处不在,即使是在手机、嵌入式设备上,只要运行有浏览器,都可以训练人工智能模型,但是考虑到手机、嵌入式设备有限的计算能力(虽然手机性能不断飞跃),复杂的人工智能模型还是交给更为强大的服务器来训练比较合适。况且目前主流的机器学习采用的是python语言,要让广大机器学习工程师从python转向js,估计大家也不会答应。

如果是这样的话,那TensorFlow.js推出还有何意义呢?

这个问题其实和TensorFlow Lite类似,我们可以在服务器端训练,在手机上使用训练出的模型进行推导,通常推导并不需要那么强大的计算能力。

在本文,我们将探索如何在TensorFlow.js中加载预训练的机器学习模型,完成图片分类任务。

在TensorFlow官网,访问 www.tensorflow.org/js/models/ 这个网址,可以看到里面有实时姿态预测模型、目标检测模型、语音识别模型、分类模型等等:

这里我们选择MobileNets模型。MobileNets是一种小型、低延迟、低耗能模型,满足各种资源受限的使用场景,可用于分类、检测、嵌入和分割,功能上类似于其他流行的大型模型(如Inception)。 MobileNets在延迟、大小和准确性之间取得了平衡。

有两种使用MobileNets模型的方案:

  1. 直接调用MobileNets模型的JS封装库
  2. 自己编写代码加载json格式的MobileNets模型

直接调用MobileNets模型的JS封装库

JS封装库直接将MobileNets模型封装为JS对象,我们就像调用普通的JS对象那样,调用对象方法,完成模型加载、推断。

比如访问 github.com/tensorflow/… ,我们可以看到该mobilenet对象提供两个主要的API:

mobilenet.load(version?: 1,alpha?: 0.25 | .50 | .75 | 1.0
)
复制代码

参数:

  • 版本:MobileNet版本号。1表示MobileNet V1,2表示使用MobileNet V2。默认值为1。
  • alpha:较小的alpha会降低精度,但会提高性能。默认值为1.0。
model.classify(img: tf.Tensor3D | ImageData | HTMLImageElement |HTMLCanvasElement | HTMLVideoElement,topk?: number
)
复制代码

参数:

  • img:进行分类的Tensor或image元素。
  • topk:要返回多少个Top概率。默认值为3。

借助于封装的JS库,在浏览器中使用MobileNets就相当简单了:

<html><head><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.1"> </script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet@1.0.0"> </script></head><body><img id="img" src="cat.jpg"></img><script>const img = document.getElementById('img');// Load the model.mobilenet.load().then(model => {// Classify the image.model.classify(img).then(predictions => {console.log('Predictions: ');console.log(predictions);});});</script></body>
</html>
复制代码

注意: 这里的js代码会去google storage 加载MobileNets的JSON格式模型,而由于一些不能说的原因,国内无法访问到,请自行翻墙。

这个示例写的比较简单,从浏览器控制台输出log,显示结果,在chrome浏览器中可以打开开发者工具查看:

加载json格式的MobileNets模型

使用封装好的JS对象确实方便,但使用自己训练的模型时,并没有人为我们提供封装对象。这个时候我们就要考虑自行加载模型,并进行推断。在JS世界,JSON是使用得非常普遍的数据交换格式。TensorFlow.js也采用JSON作为模型格式,也提供了工具进行转换。

本来这里想详细写一下如何加载json格式的MobileNets模型,但由于MobileNets的JS模型托管在Google服务器上,国内无法访问,所以这里先跳过这一步。在下一篇文章中我将说明如何从现有的TensorFlow模型转换为TensorFlow.js模型,并加载之,敬请关注!

以上示例有完整的代码,点击阅读原文,跳转到我在github上建的示例代码。 另外,你也可以在浏览器中直接访问:ilego.club/ai/index.ht… ,直接体验浏览器中的机器学习。

参考文献:

  1. tensorflow官网

你还可以读

  1. 一步步提高手写数字的识别率(1)(2)(3)
  2. TensorFlow.js简介
  3. 浏览器中的手写数字识别

转载于:https://juejin.im/post/5cc19cace51d456e8833398b

浏览器中的机器学习:使用预训练模型相关推荐

  1. 在你的网站、浏览器中集成3D模型预览功能,使用开源项目Online3DViewer

    开源项目Online3DViewer # 通过url参数形式预览模型 https://3dviewer.net/#[3D模型URL] Online3DViewer 是一个免费.开源的web解决方案,可 ...

  2. 【机器学习】Tensorflow.js:在浏览器中使用机器学习实现图像分类

    ⭐️ 本文首发自 前端修罗场(点击加入),是一个由资深开发者独立运行的专业技术社区,我专注 Web 技术.答疑解惑.面试辅导以及职业发展.现在加入,私聊我即可获取一次免费的模拟面试机会,帮你评估知识点 ...

  3. python 加载动图_在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

    大数据文摘授权转载自数据派THU 作者:MOHD SANAD ZAKI RIZVI 本文主要介绍了: TensorFlow.js (deeplearn.js)使我们能够在浏览器中构建机器学习和深度学习 ...

  4. 独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)

    作者:MOHD SANAD ZAKI RIZVI 翻译:吴金笛 校对:丁楠雅 本文约5500字,建议阅读15分钟. 本文首先介绍了TensorFlow.js的重要性及其组件,并介绍使用其在浏览器中构建 ...

  5. linux tensorflow demo_独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

    作者:MOHD SANAD ZAKI RIZVI 翻译:吴金笛 校对:丁楠雅 本文约5500字,建议阅读15分钟. 本文首先介绍了TensorFlow.js的重要性及其组件,并介绍使用其在浏览器中构建 ...

  6. EMNLP 2021中预训练模型最新研究进展

    © 作者|周昆 机构|中国人民大学信息学院 研究方向|序列表示学习与应用 导读 EMNLP 2021是人工智能领域自然语言处理( Natural Language Processing,NLP)三大顶 ...

  7. Pytorch:NLP 迁移学习、NLP中的标准数据集、NLP中的常用预训练模型、加载和使用预训练模型、huggingface的transfomers微调脚本文件

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) run_glue.py微调脚本代码 python命令执行run ...

  8. ICML 2019:序列到序列自然语言生成任务超越BERT、GPT!微软提出通用预训练模型MASS | 技术头条...

    来源 | 微软研究院AI头条(id:MSRAsia) 责编 | Jane 编者按:从2018年开始,预训练(pre-train) 毫无疑问成为NLP领域最热的研究方向.借助于BERT和GPT等预训练模 ...

  9. 华为云苏嘉:如何整合预训练模型和知识图谱做医疗推理?

    本文约4100字,建议阅读8分钟 本文将讨论如何为AI+医疗提供一种行之有效的解决方案. [ 导读 ] 随着人工智能技术特别是深度学习的普及,医疗行业也迎来一波革命的热潮,本文将讨论如何利用AI技术将 ...

最新文章

  1. 学python看什么书好1002无标题-如何使用pandas读取txt文件中指定的列(有无标题)
  2. 定时器表达式各组成部分详解
  3. html设置列表菜单,css 列表菜单的设计
  4. K8S Service服务用于对外暴露应用
  5. fixture.detectChange开始单步调试,如何执行到Directive的ngOnChange钩子
  6. 【Java】数组的使用
  7. ES6技巧和窍门,使您的代码更简洁,更短且更易于阅读!
  8. Android多媒体整体架构图
  9. 【elasticsearch】es直接put一个数据到es Can‘t merge because of conflicts Cannot update enabled setting _source
  10. 远程监督在关系抽取中的应用
  11. redhat6静默安装oracle11g,redhat6.2静默安装oracle11gr2
  12. 如何在word文档使其单页变为横向,教程来啦,怎样把word文档更改为横向
  13. 2022茶艺师(初级)试题及在线模拟考试
  14. 说说 PWA 和微信小程序--Progressive Web App
  15. 负数和正数的存储方式。
  16. PHP网页页脚咋设计,50个网页头部与网页页脚设计欣赏
  17. win7网络找不到局域网计算机名,教你操作win7系统局域网内找不到其他电脑的解决方法...
  18. matlab:数组定义
  19. vb/vb.net开发精粹(4)
  20. 最好用的Android黑客应用程序和工具

热门文章

  1. Oracle的不完全恢复
  2. 如何用 Gitlab 做团队内的 Code Review
  3. iOS之UI--涂鸦画板实例 (有待更新)
  4. 执行setenv ethaddr的时候提示Can't over write的原因及解决方法
  5. phpmailer发送邮件
  6. jQuery 1.4单独为某个动画动作设效果
  7. 计算bom的准确用量
  8. SpringBoot实现定时器定时处理任务
  9. (转)计算机网络基础知识总结
  10. 页面的div中有滚动条,js实现刷新页面后回到记录时滚动条的位置