ie 引用公共js_使用TensorFlow.js在Node.js中进行机器学习

作者:jthomas

黑胡桃实验室敲制

在本文中,作者将介绍如何在Node.js环境下使用TensorFlow.js,并使用MobileNet模型来完成一个分类任务。

a86034fe2f0f6d69e3f029c6db0cc735.png

前言

TensorFlow.js是流行的机器学习开源库的新版本,它为JavaScript带来了机器学习的力量。开发人员现在可以使用TensorFlow.js的高级API定义,训练和运行机器学习模型。

TensorFlow.js可以使用预先训练的模型,这意味着开发人员现在可以通过几行JavaScript 轻松执行复杂的任务,如视觉识别生成音乐或姿态估计

TensorFlow.js作为Web浏览器的前端库,最近增加了对Node.js的支持。这允许TensorFlow.js在后端JavaScript应用程序中使用,而无需使用Python。

不幸的是,官网提供的大多数文档和示例代码都在浏览器中使用TensorFlow.js库。为了简化加载和使用预先训练的模型而提供的项目实用程序尚未添加对Node.js的支持。最后,我花了很多时间阅读库中的源代码。

经过了几天的研究,我设法完成了下面这个教程。欢呼!

① 安装TensorFlow.js的库

这里,我们可以直接使用NPM进行安装

@tensorflow/tfjs TensorFlow.js核心库@tensorflow/tfjs-node TensorFlow.js的Node.js扩展库@tensorflow/tfjs-node-gpu 支持GPU的TensorFlow.js的扩展库

npm install @tensorflow/tfjs @tensorflow/tfjs-node// or...npm install @tensorflow/tfjs @tensorflow/tfjs-node-gpu

Node.js扩展都使用本地依赖项,这些依赖项将会被在本地进行编译。

加载TensorFlow库

先导入TensorFlow.js的核心库,再导入Node.js的扩展库。

const tf = require('@tensorflow/tfjs')// 导入CPU版的require('@tensorflow/tfjs-node')// 导入GPU版的require('@tensorflow/tfjs-node-gpu')

③加载TensorFlow模型

TensorFlow.js提供了一个NPM库(tfjs-models),使用它可以轻松地加载经过转换的预训练模型,可以用于图像分类,姿态估计和KNN分类器等。

这里我们将使用用于图像分类的MobileNet模型,这个模型是经过预训练的,可以识别1000个不同类别物体的深度神经网络。

import * as mobilenet from '@tensorflow-models/mobilenet';// 导入模型.const model = await mobilenet.load();

我们遇到的第一个挑战就是这种模型加载方式并不适用于Node.js。

Error: browserHTTPRequest is not supported outside the web browser.

通过查看源代码发现,MobileNet库是底层 tf.Model类的包装器,调用 load() 方法时,它会自动从外部HTTP地址上下载正确的模型文件,并实例化TensorFlow模型。

Node.js扩展库不支持使用HTTP请求来加载模型。相反,必须从文件系统手动加载模型。

在阅读过库的源代码后,我设法创建了一个解决方案......

从文件系统加载模型

如果手动创建MobileNet类,而不是调用模块的加载方法,则可以使用本地模型文件的路径来覆盖存有模型文件的HTTP地址的路径变量。完成此操作后,在实例上调用 load() 方法将触发文件系统加载器类,而不是使用基于浏览器的HTTP加载器类。

const path = "mobilenet/model.json"const mn = new mobilenet.MobileNet(1, 1);// 这里替换成模型文件在磁盘上的路径mn.path = `file://${path}`await mn.load()

太棒了,它开始工作了!

但是,模型文件是来源于哪里呢?

下载模型文件

TensorFlow.js的模型由两种文件类型组成,一种是存储在JSON中的模型配置文件,另一种是二进制格式的模型权重。模型权重通常被分片为多个文件,以便浏览器更好地进行缓存。

查看 MobileNet模型的加载代码,发现模型的配置文件和权重分配都存储在公共的数据存储空间中。

https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v${version}_${alpha}_${size}/

URL中的 version 参数可以填下面的模型版本。每个版本的分类准确性结果也显示在该页面上。

4f10aa6d4a0608bc42baafae7d8a2b83.png

tf.js支持的MobileNet模型(不完全列出)

在源代码中,只能使用tensorflow-models/mobilenet库加载MobileNet v1模型。

HTTP检索代码将从此URL加载model.json文件,然后递归获取所有引用的模型权重分片。这些文件的格式为 groupX-shard1of1。

将所有模型文件保存到文件系统可以通过检索模型配置文件,解析引用的权重文件并手动下载每个权重文件来实现。

我想使用具有1.0 alpha值和224像素图像大小的MobileNet V1模块,这是相关模型的URL。

https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/model.json

然后我们将模型配置文件model.json保存下来,放入到jupyter中查看模型文件的结构。

aa416daa80eaaf28da6e07c2df9da589.png

Model.json中的结构(不完全列出)

从中可以看出,权重分片共有54个(图中没有显示完全),第一个权重分片叫做 group1-shard10f1 。可以通过以下URL来进行下载

https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/group1-shard1of1

但是共有54个权重分片,手动下载起来很麻烦,我们准备了一个下载脚本,来自动化下载模型文件这个过程。

import urllib.requestimport json## 加载 model.js文件with open("model.json
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值