当微信小程序遇上 TensorFlow本地缓存模型

标签:程序,遇上,本地,缓存,模型 发布时间:2019年07月20日 点击8

从明天开始,我开始休年假,预备去云南逛一逛,估计这段时间又无法更新公众号,还请大家谅解。

在《 当微信小程序遇上TensorFlow - tensorflow.js篇 》一文中,我介绍了在微信小程序中使用TensorFlow.js,有同伙可能细致到,小程序每次都必要从网络加载模型。虽然tensorflow.js官方声称行使了欣赏器的缓存技术,并不会每次都从网络下载。但在微信小程序中,使用的是wx.request接口下载文件关键词排名优化,测试下来发现,好像没有缓存机制。虽然小程序号称即用即走,但每次都必要从网络下载模型,完全表现不出端推测的好处,况且深度学习模型通常也不小,通常有好几M。那我们能否将模型存储到本地呢?

查阅tfjs的文档,在欣赏器中,提供了几种本地存储的体例:

  1. 将模型保存到欣赏器的local storage淄博网络公司,后续可以从local storage加载

  2. 将模型保存到欣赏器的IndexDB上海私家侦探公司,然后从IndexDB加载

  3. 将模型通过下载体例保存到本地,然后可以通过文件上载体例加载模型

微信小程序支撑两种情势的本地存储:数据缓存和本地文件。为此,我参考了 browser_files.ts 的实现,实现了微信小程序平台下的本地文件存储 mp_files.ts 。详细代码可以参考:https://github3564/mogoweb/wechat-tfjs-core

实现上并没什么分外的难度,但是栽在微信小程序的坑里,爬了好几天才找到缘故原由。详细说来就是 FileSystemManager.readFile(Object object) 这个接口,不要想当然的认为将 encoding 设为 binary ,就会返回 ArrayBuffer 类型数据,文档对 encoding 参数的说明是:

指定读取文件的字符编码,假如不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容

所以为了以二进制字节读取文件内容,万万不要传 encoding 参数,否则永久返回的是 string 类型数据。

至于模型保存,可以参考如下代码,为此我为小程序定义了一个 mp:// 前缀:

const save_model = async model => {

  const saveResult = await model.save('mp://' + wx.env.USER_DATA_PATH + '/mymodel');
  console.log(saveResult);
}

加载模型,文件路径请指定精确的json和权重文件,无需加上 mp:// 前缀:

const load_model = async () => {

  let model_files = [wx.env.USER_DATA_PATH + '/mymodel.json', wx.env.USER_DATA_PATH + '/mymodel.weights.bin'];
  var model = await tf.loadLayersModel(tf.io.mpFiles(model_files));
  return model;
}

示例代码可以参考:https://github3564/mogoweb/wechat-tfjs-examples

必要细致的是, 微信小程序对于本地文件总大小有10M的限定 ,所以这种方法只适合比较小的模型,假如那种几十M的深度学习模型,照旧尽量部署到服务器。毕竟小程序的初衷就是小巧、轻巧,假如过重浙江人事考试网,就背离了小程序的设计理念。

手机网站建设