手把手教程:如何從零開始訓練 TF 模型並在安卓系統上運行

2021-01-12 雷鋒網

本教程介紹如何使用 tf.Keras 時序 API 從頭開始訓練模型,將 tf.Keras 模型轉換為 tflite 格式,並在 Android 上運行該模型。我將以 MNIST 數據為例介紹圖像分類,並分享一些你可能會面臨的常見問題。本教程著重於端到端的體驗,我不會深入探討各種 tf.Keras API 或 Android 開發。

下載我的示例代碼並執行以下操作:

1.訓練自定義分類器

加載數據

我們將使用作為tf.keras框架一部分的mnst數據。

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

預處理數據

接下來,我們將輸入圖像從 28x28 變為 28x28x1 的形狀,將其標準化,並對標籤進行 one-hot 編碼。

定義模型體系結構

然後我們將用 cnn 定義網絡架構。

def create_model():


        # Define the model architecture

       model = keras.models.Sequential([

              # Must define the input shape in the first layer of the neural network

              keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu', input_shape=(28,28,1)),

              keras.layers.MaxPooling2D(pool_size=2),

              keras.layers.Dropout(0.3),


keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),

       keras.layers.MaxPooling2D(pool_size=2),

       keras.layers.Dropout(0.3),


keras.layers.Flatten(),

       keras.layers.Dense(128, activation='relu'),

       keras.layers.Dropout(0.5),

       keras.layers.Dense(10, activation='softmax')

])


# Compile the model

model.compile(loss=keras.losses.categorical_crossentropy,

       optimizer=keras.optimizers.Adam(),

       metrics=['accuracy'])


return model




訓練模型

然後我們使用 model.fit()來訓練模型。

model.fit(x_train,

                y_train,

               batch_size=64,

               epochs=3,

               validation_data=(x_test, y_test))

2.模型保存和轉換

訓練結束後,我們將保存一個 Keras 模型並將其轉換為 TFLite 格式。

保存一個 Keras 模型

下面是保存 Keras 模型的方法-

# Save tf.keras model in HDF5 format

keras_model = "mnist_keras_model.h5"

keras.models.save_model(model, keras_model)

將keras模型轉換為tflite

當使用 TFLite 轉換器將 Keras 模型轉換為 TFLite 格式時,有兩個選擇- 1)從命令行轉換,或 2)直接在 python 代碼中轉換,這個更加推薦。

1)通過命令行轉換

$ tflite_convert \

$ --output_file=mymodel.tflite \

$ --keras_model_file=mymodel.h5




2)通過 python 代碼轉換

如果你可以訪問模型訓練代碼,則這是轉換的首選方法。

# Convert the model

flite_model = converter.convert()


# Create the tflite model file

tflite_model_name = "mymodel.tflite"

open(tflite_model_name, "wb").write(tflite_model)




你可以將轉換器的訓練後量化設置為 true。

# Set quantize to true

converter.post_training_quantize=True

驗證轉換的模型

將 Keras 模型轉換為 TFLite 格式後,驗證它是否能夠與原始 Keras 模型一樣正常運行是很重要的。請參閱下面關於如何使用 TFLite 模型運行推斷的 python 代碼片段。示例輸入是隨機輸入數據,你需要根據自己的數據更新它。

# Load TFLite model and allocate tensors. interpreter = tf.contrib.lite.Interpreter(model_path="converted_model.tflite")

interpreter.allocate_tensors()


# Get input and output tensors

input_details = interpreter.get_input_details() output_details = interpreter.get_output_details()


# Test model on random input data

input_shape = input_details[0]['shape']

input_data = np.array(np.random.random_sample(input_shape),

dtype=np.float32) interpreter.set_tensor(input_details[0]['index'], input_data)

interpreter.invoke()

output_data = interpreter.get_tensor(output_details[0]['index'])

print(output_data)

ps:確保在轉換後和將 TFLite 模型放到 Android 上面之前始終測試它。否則,當它在你的 Android 應用程式上不能工作時,你無法分清是你的 android 代碼有問題還是 ML 模型有問題。

3.在 Android 上實現 tflite 模型

現在我們準備在 Android 上實現 TFLite 模型。創建一個新的 Android 項目並遵循以下步驟

將 mnist.tflite 模型放在 assets 文件夾下

更新 build.gradle 以包含 tflite 依賴項

為用戶創建自定義視圖

創建一個進行數字分類的分類器

從自定義視圖輸入圖像

圖像預處理

用模型對圖像進行分類

後處理

在用戶界面中顯示結果

Classifier 類是大多數 ML 魔術發生的地方。確保在類中設置的維度與模型預期的維度匹配:

28x28x1 的圖像

10 位數字的 10 個類:0、1、2、3…9

要對圖像進行分類,請執行以下步驟:

預處理輸入圖像。將位圖轉換為 bytebuffer 並將像素轉換為灰度,因為 MNIST 數據集是灰度的。

使用由內存映射到 assets 文件夾下的模型文件創建的解釋器運行推斷。

後處理輸出結果以在 UI 中顯示。我們得到的結果有 10 種可能,我們將選擇在 UI 中顯示概率最高的數字。

過程中的挑戰

以下是你可能遇到的挑戰:

如果 Android 應用程式崩潰,請查看 logcat 中的 stacktrace 錯誤:

aaptOptions {

         noCompress "tflite"

}

總體來說,用 tf.Keras 訓練一個簡單的圖像分類器是輕而易舉的,保存 Keras 模型並將其轉換為 TFLite 也相當容易。目前,我們在 Android 上實現 TFLite 模型的方法仍然有點單調,希望將來能有所改進。

via:https://medium.com/@margaretmz/e2e-tfkeras-tflite-android-273acde6588

雷鋒網雷鋒網雷鋒網(公眾號:雷鋒網)

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    她在 Insight 工作的時候,在安卓系統上用 TensorFlow 部署了一個 WaveNet 模型。本文詳細介紹了部署和實現過程。對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。
  • 【從零開始的異世界生活-無限】電腦版怎麼玩—安卓模擬器使用教程
    《從零開始的異世界生活-無限》電腦版是通過雷電安卓模擬器這個軟體實現的手遊電腦版本。雷電模擬器是一款極速免費的電腦軟體,目前已經適配市面上大多數安卓版本的主流手遊與應用,同時可以匹配手機實現互通玩遊戲。《從零開始的異世界生活-無限》是一款根據同名人氣動畫改編的卡牌養成 RPG 手遊。遊戲保留了動漫的精髓,復刻還原人物、場景和劇情,原班CV全新配音,完美還原。
  • 《迷你世界》路燈微縮模型搭建圖文教程 手把手教你路燈怎麼做
    《迷你世界》路燈微縮模型搭建圖文教程 手把手教你路燈怎麼做時間:2020-02-02 16:02   來源:牛遊戲網   責任編輯:沫朵 川北在線核心提示:原標題:《迷你世界》路燈微縮模型搭建圖文教程 手把手教你路燈怎麼做 《迷你世界》是一款高度自由的休閒類3D沙盒遊戲,有著非常方便快捷的多人聯機模式,在這裡,你能夠隨心所欲創造一切
  • 手把手教你戴爾臺式機如何重裝系統
    大家好,今天分享一篇來自系統之家官網(windowszj.com)的圖文教程。重裝系統就是指對計算機內的作業系統進行重新的安裝,那麼問題來了,小夥伴你們知道戴爾臺式機要如何重裝系統嗎?不知道的話也沒有關係哦,因為接下來小編就將戴爾臺式機重裝系統win10的教程分享給大家。
  • 用華為、小米手機DIY自主導航機器人:只需三百塊,教程已開源,人人...
    操作人員可以在智慧型手機上安裝一個安卓app,然後通過app的界面,在運行更高級別的感知和把控工作量的同時進行數據集的收集。此外,在Arduino上運行的程序能夠進行簡單的驅動,並測量裡程計與電池電壓等等。 安裝了安卓app之後,OpenBot還能通過你們現有的兼容了藍牙設備的PS4、Xbox和Switch等遊戲控制器進行操控。
  • Windows 10系統可成功運行安卓應用程式
    打開APP Windows 10系統可成功運行安卓應用程式 李正浩 發表於 2020-12-14 11:12:04 微軟內部有一個名為「Latte」的項目,使用戶可以在Windows 10上運行安卓應用。
  • 神奇的Batchnorm 僅訓練BN層會發生什麼
    因此,大多數模型經常在所有Conv-ReLU操作之間頻繁使用它,形成「 Conv-BN-ReLU」三重奏(及其變體)。 然而,儘管這是最常出現的層之一,但其優勢背後的原因在文獻中卻有很多爭議。 下面三個主要的說法:內部方差平移:簡單地說,如果輸出的均值和單位方差為零,則下一層會在穩定的輸入上訓練。
  • Re:從零開始的鴻蒙開發教程
    在傳統的單設備系統能力的基礎上,HarmonyOS提出了基於同一套系統能力、適配多種終端形態的分布式理念,能夠支持多種終端設備。在我看來:HarmonyOS是一款可以用Java或JS開發的國產手機作業系統。也就意味著我們可以更快的入門鴻蒙開發。
  • 快速訓練殘差網絡 ResNet-101,完成圖像分類與預測,精度高達 98%|...
    因此在已經存在一個針對任務A訓練好的模型前提下,在訓練任務B的模型時,我們可以不從零開始訓練,而是基於在任務 A 上獲得的知識再進行訓練。在這裡,針對A任務已經訓練好的模型參數稱之為:預訓練模型。這和「站在巨人的肩膀上」的思想非常類似。
  • 《安娜卡列尼娜》文本生成——利用 TensorFlow 構建 LSTM 模型
    - 模型訓練:設置模型參數對模型進行訓練- 生成新文本:訓練新的文本主題:整個文本將基於《安娜卡列妮娜》這本書的英文文本作為 LSTM 模型的訓練數據,輸入為單個字符,通過學習整個英文文檔的字符(包括字母和標點符號等)來進行文本生成。
  • 銀河麒麟Kydroid 2.0系統正式發布:兼容運行安卓App
    據官方介紹,Kydroid 是麒麟團隊和技德系統為「銀河麒麟作業系統」打造的一款完全原生、高兼容性的安卓運行環境,用於解決用戶的多樣化應用需求。現在,kydroid 2.0系統正式發布。安卓生態兼容方式在技術上可以分為三種方式:Google Arc,需要商業chrome的支持,應用有限,效率一般;虛擬機與模擬器,效率較低,資源佔用高,環境與宿主系統隔離,無法同時運行多個安卓App;Kydroid技術方案,是將安卓運行環境以組件化的方式運行在銀河麒麟作業系統之上,安卓運行環境受到銀河麒麟系統的管理和控制,從本質上讓銀河麒麟系統真正的支持安卓App的運行。
  • 《迷你 》汽車製作圖文教程 手把手教你汽車怎麼做
    :原標題:《迷你 》汽車製作圖文教程 手把手教你汽車怎麼做 《迷你 》是一款高度自由的休閒類3D沙盒遊戲,有著非常方便快捷的多人聯機模式,在這裡,你能夠隨心所欲創造一切,那麼《迷你 》汽車怎麼做?
  • 麒麟作業系統:在linux上運行安卓應用
    使用安卓生態,對於發展linux系統來說相當重要,畢竟安卓也是基於linux內核,兩者關係密切。麒麟軟體和技徳系統團隊合作,讓麒麟系統可以運行安卓應用。其依託安卓運行環境Kydroid 3.0,可提供完全原生、高兼容性的使用體驗。
  • 熊小白玩安卓02期:僅需四步學會,安卓平板運行Photoshop電腦版
    相信iPad Photoshop版發布之後,很多使用安卓平板電腦的用戶一定對其羨慕不已,到底何時才有用上像iPad平臺那樣的功能全面的Photoshop軟體呢?接下來,本篇文章就為大家詳細介紹一下,如何在安卓行動裝置(安卓手機、安卓平板)上運行Photoshop電腦版?具體的操控體驗到底如何?
  • 《迷你世界》汽車製作圖文教程 手把手教你汽車怎麼做
    《迷你世界》汽車製作圖文教程 手把手教你汽車怎麼做時間:2020-01-31 15:07   來源:牛遊戲網   責任編輯:沫朵 川北在線核心提示:原標題:《迷你世界》汽車製作圖文教程 手把手教你汽車怎麼做 《迷你世界》是一款高度自由的休閒類3D沙盒遊戲,有著非常方便快捷的多人聯機模式,在這裡,你能夠隨心所欲創造一切,那麼《
  • TensorFlow 2.4來了:上線對分布式訓練和混合精度的新功能支持
    ParameterServerStrategy 和自定義訓練循環進行模型異步訓練的試驗性支持。像單工作器的 MirroredStrategy 一樣,MultiWorkerMirroredStrategy 通過同步數據並行實現分布式訓練,顧名思義,藉助 MultiWorkerMirroredStrategy 可以在多臺機器上進行訓練,每臺機器都可能具有多個 GPU。
  • NLP之文本分類:「Tf-Idf、Word2Vec和BERT」三種模型比較
    >概要在本文中,我將使用NLP和Python來解釋3種不同的文本多分類策略:老式的詞袋法(tf-ldf),著名的詞嵌入法(Word2Vec)和最先進的語言模型(BERT)。在Python中,可以像這樣從genism-data中加載一個預訓練好的詞嵌入模型:我將不使用預先訓練好的模型,而是用gensim在訓練數據上自己訓練一個Word2Vec。在訓練模型之前,需要將語料轉換為n元文法列表。
  • 微軟被曝開發原生運行安卓App的Win10系統,最早明年見
    此前,微軟曾計劃通過一個名為 Astoria 的項目將安卓 app 引入 Windows 10 系統,但該項目無疾而終。「Latte」項目的開發目的與之類似,並且可能由 Windows 面向 Linux 的子系統 WSL 提供支持。但要真正運行起來,微軟需要提供能夠運行安卓 app 的安卓子系統。
  • 電腦WIN10《口袋妖怪Pokemon:GO》安卓模擬器教程
    日前官方曾在臉書上公開表示, 《口袋妖怪:GO》(又稱Pokemon:GO或精靈寶可夢:GO)將不會登陸中國地區,並無開啟國服的計劃安排,這無疑讓國內眾多的粉絲們大失所望,然而上有政策,下有對策,近期國外網友研究出一套可以在WIN10電腦上運行這款遊戲的辦法,原理就是在WIN10系統上使用安卓模擬器來運行《口袋妖怪:GO》。