用戶
 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

掃一掃,登錄網站

小程序社區 首頁 教程 查看內容

當微信小程序遇上 TensorFlow:本地緩存模型

Rolan 2019-7-3 10:08

從明天開始,我開始休年假,準備去云南逛一逛,估計這段時間又無法更新公眾號,還請大家諒解。在《當微信小程序遇上TensorFlow - tensorflow.js篇》一文中,我介紹了在微信小程序中使用TensorFlow.js,有朋友可能注 ...

從明天開始,我開始休年假,準備去云南逛一逛,估計這段時間又無法更新公眾號,還請大家諒解。

在《 當微信小程序遇上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://github.com/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://github.com/mogoweb/wechat-tfjs-examples

需要注意的是, 微信小程序對于本地文件總大小有10M的限制 ,所以這種方法只適合比較小的模型,如果那種幾十M的深度學習模型,還是盡量部署到服務器。畢竟小程序的初衷就是小巧、輕便,如果過重,就背離了小程序的設計理念。

鮮花
鮮花
雞蛋
雞蛋
分享至 : QQ空間
收藏
原作者: 陳正勇 來自: 云水木石
致青春APP