chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

全新插件tflite_flutter

Tensorflowers ? 來(lái)源:TensorFlow ? 2020-09-27 14:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

如果您希望能有一種簡(jiǎn)單、高效且靈活的方式把 TensorFlow 模型集成到 Flutter 應(yīng)用里,那請(qǐng)您一定不要錯(cuò)過我們今天介紹的這個(gè)全新插件tflite_flutter。這個(gè)插件的開發(fā)者是 Google Summer of Code (GSoC) 的一名實(shí)習(xí)生 Amish Garg。

tflite_flutter插件的核心特性:

插件提供了與 TFLite Java 和 Swift API 相似的 Dart API,所以其靈活性和在這些平臺(tái)上的效果是完全一樣的;

插件通過 dart:ffi 直接與 TensorFlow Lite C API 相綁定,所以它比其它平臺(tái)集成方式更加高效;

無(wú)需編寫特定平臺(tái)的代碼;

通過 NNAPI 提供加速支持,在 Android 上使用 GPU Delegate,在 iOS 上使用 Metal Delegate。

本文中,我們將使用 tflite_flutter 構(gòu)建一個(gè)文字分類 Flutter 應(yīng)用,帶您體驗(yàn) tflite_flutter 插件。首先從新建一個(gè) Flutter 項(xiàng)目text_classification_app開始。

初始化配置

Linux 和 Mac用戶

將 install.sh 拷貝到您應(yīng)用的根目錄,然后在根目錄執(zhí)行 sh install.sh,本例中就是目錄 text_classification_app/。

Windows 用戶

將 install.bat 文件拷貝到應(yīng)用根目錄,并在根目錄運(yùn)行批處理文件 install.bat,本例中就是目錄 text_classification_app/。

它會(huì)自動(dòng)從GitHub 倉(cāng)庫(kù)的 Releases 里下載最新的二進(jìn)制資源,然后把它放到指定的目錄下。

請(qǐng)點(diǎn)擊到 README 文件里查看更多關(guān)于初始配置的信息。

tflite_flutter 的 GitHub 倉(cāng)庫(kù)
https://github.com/am15h/tflite_flutter_plugin

獲取插件

在pubspec.yaml添加tflite_flutter: ^

最新版本情況參考插件的發(fā)布地址
https://pub.flutter-io.cn/packages/tflite_flutter

下載模型

要在移動(dòng)端上運(yùn)行 TensorFlow 訓(xùn)練模型,我們需要使用 .tflite 格式。如果需要了解如何將 TensorFlow 訓(xùn)練的模型轉(zhuǎn)換為 .tflite 格式,請(qǐng)參閱官方指南。

這里我們準(zhǔn)備使用 TensorFlow 官方站點(diǎn)上預(yù)訓(xùn)練的文字分類模型。

該預(yù)訓(xùn)練的模型可以預(yù)測(cè)當(dāng)前段落的情感是積極還是消極。它是基于來(lái)自 Mass 等人的 Large Movie Review Dataset v1.0數(shù)據(jù)集進(jìn)行訓(xùn)練的。數(shù)據(jù)集由基于 IMDB 電影評(píng)論所標(biāo)記的積極或消極標(biāo)簽組成,查看更多信息。

將 text_classification.tflite 和 text_classification_vocab.txt 文件拷貝到 text_classification_app/assets/ 目錄下。

在 pubspec.yaml 文件中添加 assets/。

assets: - assets/

現(xiàn)在萬(wàn)事俱備,我們可以開始寫代碼了。

模型轉(zhuǎn)換器(Converter)的 Python API 指南
https://tensorflow.google.cn/lite/convert/python_api

預(yù)訓(xùn)練的文字分類模型(text_classification.tflite)
https://files.flutter-io.cn/posts/flutter-cn/2020/tensorflow-lite-plugin/text_classification.tflite

數(shù)據(jù)集(text_classification_vocab.txt)
https://files.flutter-io.cn/posts/flutter-cn/2020/tensorflow-lite-plugin/text_classification_vocab.txt

實(shí)現(xiàn)分類器

預(yù)處理

正如文字分類模型頁(yè)面里所提到的??梢园凑障旅娴牟襟E使用模型對(duì)段落進(jìn)行分類:

對(duì)段落文本進(jìn)行分詞,然后使用預(yù)定義的詞匯集將它轉(zhuǎn)換為一組詞匯 ID;

將生成的這組詞匯 ID 輸入 TensorFlow Lite 模型里;

從模型的輸出里獲取當(dāng)前段落是積極或者是消極的概率值。

我們首先寫一個(gè)方法對(duì)原始字符串進(jìn)行分詞,其中使用 text_classification_vocab.txt作為詞匯集。

在 lib/文件夾下創(chuàng)建一個(gè)新文件 classifier.dart。

這里先寫代碼加載 text_classification_vocab.txt 到字典里。

import 'package:flutter/services.dart'; class Classifier { final _vocabFile = 'text_classification_vocab.txt'; Map _dict; Classifier() { _loadDictionary(); } void _loadDictionary() async { final vocab = await rootBundle.loadString('assets/$_vocabFile'); var dict = {}; final vocabList = vocab.split(' '); for (var i = 0; i < vocabList.length; i++) { var entry = vocabList[i].trim().split(' '); dict[entry[0]] = int.parse(entry[1]); } _dict = dict; print('Dictionary loaded successfully'); } }

△加載字典

現(xiàn)在我們來(lái)編寫一個(gè)函數(shù)對(duì)原始字符串進(jìn)行分詞。

import 'package:flutter/services.dart'; class Classifier { final _vocabFile = 'text_classification_vocab.txt'; // 單句的最大長(zhǎng)度 final int _sentenceLen = 256; final String start = ''; final String pad = ''; final String unk = ''; Map _dict; List> tokenizeInputText(String text) { // 使用空格進(jìn)行分詞 final toks = text.split(' '); // 創(chuàng)建一個(gè)列表,它的長(zhǎng)度等于 _sentenceLen,并且使用 的對(duì)應(yīng)的字典值來(lái)填充 var vec = List.filled(_sentenceLen, _dict[pad].toDouble()); var index = 0; if (_dict.containsKey(start)) { vec[index++] = _dict[start].toDouble(); } // 對(duì)于句子里的每個(gè)單詞,在映射里找到相應(yīng)的索引值 for (var tok in toks) { if (index > _sentenceLen) { break; } vec[index++] = _dict.containsKey(tok) ? _dict[tok].toDouble() : _dict[unk].toDouble(); } // 按照我們的解釋器輸入 tensor 所需的格式 [1, 256] 返回 List> return [vec]; } }

△分詞代碼

使用 tflite_flutter 進(jìn)行分析

這是本文的主體部分,這里我們會(huì)討論 tflite_flutter 插件的用途。

此處的分析指的是在設(shè)備上基于輸入的數(shù)據(jù),使用 TensorFlow Lite 模型的處理過程。要使用 TensorFlow Lite 模型進(jìn)行分析,需要通過解釋器來(lái)運(yùn)行它,了解更多。

創(chuàng)建解釋器,加載模型

tflite_flutter 提供了一個(gè)方法直接通過資源創(chuàng)建解釋器。

static Future fromAsset(String assetName, {InterpreterOptions options})

由于我們的模型在 assets/文件夾下,需要使用上面的方法來(lái)創(chuàng)建解析器。對(duì)于 InterpreterOptions 的相關(guān)說(shuō)明,請(qǐng)參考這里。

import 'package:flutter/services.dart'; // 引入 tflite_flutter import 'package:tflite_flutter/tflite_flutter.dart'; class Classifier { // 模型文件的名稱 final _modelFile = 'text_classification.tflite'; // TensorFlow Lite 解釋器對(duì)象 Interpreter _interpreter; Classifier() { // 當(dāng)分類器初始化以后加載模型 _loadModel(); } void _loadModel() async { // 使用 Interpreter.fromAsset 創(chuàng)建解釋器 _interpreter = await Interpreter.fromAsset(_modelFile); print('Interpreter loaded successfully'); } }

△創(chuàng)建解釋器的代碼

如果您不希望將模型放在assets/目錄下,tflite_flutter 還提供了工廠構(gòu)造函數(shù)創(chuàng)建解釋器,更多信息。

我們開始進(jìn)行分析!

現(xiàn)在用下面方法啟動(dòng)分析:

void run(Object input, Object output);

注意這里的方法和 Java API 中的是一樣的。

Object input 和 Object output 必須是與 Input Tensor 和 Output Tensor 維度相同的列表。

要查看 input tensor 和 output tensor 的維度,可以使用如下代碼:

_interpreter.allocateTensors(); // 打印 input tensor 列表 print(_interpreter.getInputTensors()); // 打印 output tensor 列表 print(_interpreter.getOutputTensors());

在本例中 text_classification 模型的輸出如下:

InputTensorList: [Tensor{_tensor: Pointer: address=0xbffcf280, name: embedding_input, type: TfLiteType.float32, shape: [1, 256], data: 1024] OutputTensorList: [Tensor{_tensor: Pointer: address=0xbffcf140, name: dense_1/Softmax, type: TfLiteType.float32, shape: [1, 2], data: 8]

現(xiàn)在,我們實(shí)現(xiàn)分類方法,該方法返回值為 1 表示積極,返回值為 0 表示消極。

int classify(String rawText) { // tokenizeInputText 返回形狀為 [1, 256] 的 List> List> input = tokenizeInputText(rawText); // [1,2] 形狀的輸出 var output = List(2).reshape([1, 2]); // run 方法會(huì)運(yùn)行分析并且存儲(chǔ)輸出的值 _interpreter.run(input, output); var result = 0; // 如果輸出中第一個(gè)元素的值比第二個(gè)大,那么句子就是消極的 if ((output[0][0] as double) > (output[0][1] as double)) { result = 0; } else { result = 1; } return result; }

△用于分析的代碼

在 tflite_flutter 的 extension ListShape on List 下面定義了一些使用的擴(kuò)展:

// 將提供的列表進(jìn)行矩陣變形,輸入?yún)?shù)為元素總數(shù)并保持相等 // 用法:List(400).reshape([2,10,20]) // 返回 List List reshape(List shape) // 返回列表的形狀 List get shape // 返回列表任意形狀的元素?cái)?shù)量 int get computeNumElements

最終的 classifier.dart 應(yīng)該是這樣的:

import 'package:flutter/services.dart'; // 引入 tflite_flutter import 'package:tflite_flutter/tflite_flutter.dart'; class Classifier { // 模型文件的名稱 final _modelFile = 'text_classification.tflite'; final _vocabFile = 'text_classification_vocab.txt'; // 語(yǔ)句的最大長(zhǎng)度 final int _sentenceLen = 256; final String start = ''; final String pad = ''; final String unk = ''; Map _dict; // TensorFlow Lite 解釋器對(duì)象 Interpreter _interpreter; Classifier() { // 當(dāng)分類器初始化的時(shí)候加載模型 _loadModel(); _loadDictionary(); } void _loadModel() async { // 使用 Intepreter.fromAsset 創(chuàng)建解析器 _interpreter = await Interpreter.fromAsset(_modelFile); print('Interpreter loaded successfully'); } void _loadDictionary() async { final vocab = await rootBundle.loadString('assets/$_vocabFile'); var dict = {}; final vocabList = vocab.split(' '); for (var i = 0; i < vocabList.length; i++) { var entry = vocabList[i].trim().split(' '); dict[entry[0]] = int.parse(entry[1]); } _dict = dict; print('Dictionary loaded successfully'); } int classify(String rawText) { // tokenizeInputText 返回形狀為 [1, 256] 的 List> List> input = tokenizeInputText(rawText); //輸出形狀為 [1, 2] 的矩陣 var output = List(2).reshape([1, 2]); // run 方法會(huì)運(yùn)行分析并且將結(jié)果存儲(chǔ)在 output 中。 _interpreter.run(input, output); var result = 0; // 如果第一個(gè)元素的輸出比第二個(gè)大,那么當(dāng)前語(yǔ)句是消極的 if ((output[0][0] as double) > (output[0][1] as double)) { result = 0; } else { result = 1; } return result; } List> tokenizeInputText(String text) { // 用空格分詞 final toks = text.split(' '); // 創(chuàng)建一個(gè)列表,它的長(zhǎng)度等于 _sentenceLen,并且使用 對(duì)應(yīng)的字典值來(lái)填充 var vec = List.filled(_sentenceLen, _dict[pad].toDouble()); var index = 0; if (_dict.containsKey(start)) { vec[index++] = _dict[start].toDouble(); } // 對(duì)于句子中的每個(gè)單詞,在 dict 中找到相應(yīng)的 index 值 for (var tok in toks) { if (index > _sentenceLen) { break; } vec[index++] = _dict.containsKey(tok) ? _dict[tok].toDouble() : _dict[unk].toDouble(); } // 按照我們的解釋器輸入 tensor 所需的形狀 [1,256] 返回 List> return [vec]; } }

現(xiàn)在,可以根據(jù)您的喜好實(shí)現(xiàn) UI 的代碼,分類器的用法比較簡(jiǎn)單。

// 創(chuàng)建 Classifier 對(duì)象 Classifer _classifier = Classifier(); // 將目標(biāo)語(yǔ)句作為參數(shù),調(diào)用 classify 方法 _classifier.classify("I liked the movie"); // 返回 1 (積極的) _classifier.classify("I didn't liked the movie"); // 返回 0 (消極的)

△ 文字分類示例應(yīng)用

了解更多關(guān)于 tflite_flutter 插件的信息,請(qǐng)?jiān)L問 GitHub repo:am15h/tflite_flutter_plugin。

你問我答

問:tflite_flutter 和 tflite v1.0.5 有哪些區(qū)別?

tflite v1.0.5 側(cè)重于為特定用途的應(yīng)用場(chǎng)景提供高級(jí)特性,比如圖片分類、物體檢測(cè)等等。而新的 tflite_flutter 則提供了與 Java API 相同的特性和靈活性,而且可以用于任何 tflite 模型中,它還支持 delegate。

由于使用 dart:ffi (dart (ffi) C),tflite_flutter 非???(擁有低延時(shí))。而 tflite 使用平臺(tái)集成 (dart platform-channel (Java/Swift) JNI C)。

問:如何使用 tflite_flutter 創(chuàng)建圖片分類應(yīng)用?有沒有類似 TensorFlow Lite Android Support Library 的依賴包?

TensorFlow Lite Flutter Helper Library為處理和控制輸入及輸出的 TFLite 模型提供了易用的架構(gòu)。它的 API 設(shè)計(jì)和文檔與 TensorFlow Lite Android Support Library 是一樣的。更多信息請(qǐng)參考 TFLite Flutter Helper 的 GitHub 。

TFLite Flutter Helper 開發(fā)庫(kù) GitHub 倉(cāng)庫(kù)地址
https://github.com/am15h/tflite_flutter_helper

以上是本文的全部?jī)?nèi)容,歡迎大家對(duì) tflite_flutter 插件進(jìn)行反饋,請(qǐng)?jiān)?GitHub報(bào) bug 或提出功能需求。謝謝關(guān)注,感謝 Flutter 團(tuán)隊(duì)的 Michael Thomsen。

向 tflite_flutter 插件提出建議和反饋
https://github.com/am15h/tflite_flutter_plugin/issues

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • iOS
    iOS
    +關(guān)注

    關(guān)注

    8

    文章

    3400

    瀏覽量

    155123
  • 插件
    +關(guān)注

    關(guān)注

    0

    文章

    345

    瀏覽量

    23399
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    331

    瀏覽量

    61828

原文標(biāo)題:社區(qū)分享 | 在 Flutter 中使用 TensorFlow Lite 插件實(shí)現(xiàn)文字分類

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Flutter 移動(dòng)端開發(fā):集成淘寶 API 實(shí)現(xiàn)商品數(shù)據(jù)實(shí)時(shí)展示 APP

    在電商蓬勃發(fā)展的當(dāng)下,移動(dòng)端購(gòu)物成為主流趨勢(shì)。對(duì)于開發(fā)者而言,利用 Flutter 構(gòu)建一個(gè)能夠?qū)崟r(shí)展示淘寶商品數(shù)據(jù)的 APP,既能滿足用戶便捷獲取商品信息的需求,也能為電商業(yè)務(wù)拓展新的渠道
    的頭像 發(fā)表于 11-13 09:36 ?149次閱讀

    把edge impulse的文件存入sd卡,插入sd卡到開發(fā)板后openmv中還是顯示找不到tflite模型和labels,怎么解決?

    把edge impulse的文件存入sd卡,插入sd卡到開發(fā)板后openmv中還是顯示找不到tflite模型和labels。
    發(fā)表于 09-02 07:23

    如何進(jìn)行tflite模型量化

    在windows上,如果我們按照上一期的方式安裝了tflite2pb,是不能直接運(yùn)行的。因?yàn)槊钚泄ぞ呤菫閘inux編譯的。
    的頭像 發(fā)表于 08-13 11:45 ?1417次閱讀
    如何進(jìn)行<b class='flag-5'>tflite</b>模型量化

    Android Studio中的Gemini全面支持Dart和Flutter開發(fā)

    在 Android Studio 中創(chuàng)建 Android 應(yīng)用的 Flutter 開發(fā)者將迎來(lái)一次重大的飛躍: Android Studio 中的 Gemini 已全面支持 Dart
    的頭像 發(fā)表于 08-06 13:52 ?1047次閱讀
    Android Studio中的Gemini全面支持Dart和<b class='flag-5'>Flutter</b>開發(fā)

    用 VSCode 編寫自己的 KiCad 插件(下)

    “ ?很多小伙伴都想自己開發(fā) KiCad 插件,但不知從何入手。本文由華秋電子的另一位 KiCad 開發(fā)者波波同學(xué)撰寫,分享了如何快速搭建環(huán)境,并開發(fā)一個(gè)簡(jiǎn)單的插件。? ” ? ? ? 所有環(huán)境配置
    的頭像 發(fā)表于 06-19 11:44 ?2415次閱讀
    用 VSCode 編寫自己的 KiCad <b class='flag-5'>插件</b>(下)

    使用 Flutter SDK 3.27.4構(gòu)建HarmonyOS應(yīng)用

    使用 Flutter SDK 3.27.4構(gòu)建HarmonyOS應(yīng)用 下載鴻蒙版flutter(3.27.4版本) 項(xiàng)目地址:https://gitcode.com/openharmony-sig
    的頭像 發(fā)表于 06-11 09:15 ?699次閱讀

    Flutter on Raspberry Pi:從入門到精通的完整指南!

    在GoogleIO會(huì)議上展示了一個(gè)在樹莓派上運(yùn)行Flutter的可能性。然而,該會(huì)議并未提供全面的、一步一步的指南供用戶參考。本文旨在填補(bǔ)這一空白,提供詳細(xì)的操作步驟,幫助你在樹莓派上運(yùn)行
    的頭像 發(fā)表于 06-06 15:37 ?1357次閱讀
    <b class='flag-5'>Flutter</b> on Raspberry Pi:從入門到精通的完整指南!

    [迅為]Linux開發(fā)小技巧:Remote - SSH插件

    [迅為]Linux開發(fā)小技巧:Remote - SSH插件
    的頭像 發(fā)表于 04-01 15:46 ?919次閱讀
    [迅為]Linux開發(fā)小技巧:Remote - SSH<b class='flag-5'>插件</b>

    FlexBuild構(gòu)建Debian 12,在“tflite_ethosu_delegate”上構(gòu)建失敗了怎么解決?

    我們現(xiàn)在正在嘗試FlexBuild 構(gòu)建的 Debian 12,但它在 “tflite_ethosu_delegate” 上構(gòu)建失敗 我們知道 v24.06 中的構(gòu)建過程不包括 ml(機(jī)器學(xué)習(xí)
    發(fā)表于 04-01 06:53

    PREEvision插件使用場(chǎng)景介紹

    PREEvision插件中心(Add-in House)是Vector中國(guó)PREEvision團(tuán)隊(duì)針對(duì)中國(guó)用戶開發(fā)的插件網(wǎng)站。用戶可以在這里找到各種場(chǎng)景的擴(kuò)展插件,包括以太網(wǎng)與SOA設(shè)計(jì)、軟件及通信設(shè)計(jì)、硬件設(shè)計(jì)、變更管理等領(lǐng)域
    的頭像 發(fā)表于 03-14 13:50 ?973次閱讀
    PREEvision<b class='flag-5'>插件</b>使用場(chǎng)景介紹

    徹底移除Calico網(wǎng)絡(luò)插件

    0.前言 參考文檔:https://github.com/containernetworking/cni Pod網(wǎng)絡(luò)插件,為了實(shí)現(xiàn)Pod網(wǎng)絡(luò)而需要的插件、組件。由于Kubernetes通過開放
    的頭像 發(fā)表于 01-23 17:26 ?1776次閱讀
    徹底移除Calico網(wǎng)絡(luò)<b class='flag-5'>插件</b>

    環(huán)球儀器Omni插件機(jī)的優(yōu)勢(shì)

    由于傳統(tǒng)插件機(jī)引腳歪斜,導(dǎo)致拋料率高,減低插件成功率,提高了拋料率。環(huán)球儀器的Omni 插件機(jī),則采用兩項(xiàng)技術(shù),提高插件成功率,減低拋料率。
    的頭像 發(fā)表于 01-07 09:12 ?1421次閱讀
    環(huán)球儀器Omni<b class='flag-5'>插件</b>機(jī)的優(yōu)勢(shì)

    Kubernetes的CNI網(wǎng)絡(luò)插件之flannel

    Kubernetes設(shè)計(jì)了網(wǎng)絡(luò)模型,但卻將它的實(shí)現(xiàn)講給了網(wǎng)絡(luò)插件,CNI網(wǎng)絡(luò)插件最重要的功能就是實(shí)現(xiàn)Pod資源能夠跨主機(jī)通信。
    的頭像 發(fā)表于 01-02 09:43 ?1185次閱讀

    鴻蒙Flutter實(shí)戰(zhàn):14-現(xiàn)有Flutter 項(xiàng)目支持鴻蒙 II

    ││└── widgets #通用小型 widgets, 純dart編寫的 Flutter UI 組件 │├── components #封裝組件庫(kù),可以依賴于第三方庫(kù)/第三方插件,或依賴于 plugins中的插件
    發(fā)表于 12-26 14:59

    訊飛星火瀏覽器插件全新升級(jí)

    時(shí)刻陪伴,星火插件讓你的瀏覽器變成真正的生產(chǎn)力工具。
    的頭像 發(fā)表于 12-25 09:48 ?1723次閱讀