使用 TensorFlow 設計矩陣乘法計算並轉移執行在 Android 上 建國科技大學資管系 饒瑞佶 2017/8

Similar documents
Android + TIBBO + Socket 建國科技大學資管系 饒瑞佶

SSL VPN User Manual (SSL VPN 連線使用手冊 )

Oxford isolution. 下載及安裝指南 Download and Installation Guide

PC Link Mode. Terminate PC Link? Esc. [GO]/[Esc] - - [GO]/[Esc] 轉接座未放滿. Make auto accord with socket mounted? [GO]/[Esc] Copy to SSD E0000

Java 程式設計基礎班 (7) 莊坤達台大電信所網路資料庫研究室. Java I/O. Class 7 1. Class 7 2

RENESAS BLE 實作課程 Jack Chen Victron Technology CO., LTD 2015 Renesas Electronics Corporation. All rights reserved.

VB 拼圖應用 圖形式按鈕屬性 資科系 林偉川

桌上電腦及筆記本電腦安裝 Acrobat Reader 應用程式

EMBEDDED SYSTEMS PROGRAMMING Application Tip: Switching UIs

Applied Cognitive Computing Fall 2016 Android Application + IBM Bluemix (Cloudant NoSQL DB)

港專單一登入系統 (SSO) 讓本校的同學, 全日制及兼職老師只要一個登入帳戶, 便可同時使用由本校提供的網上系統及服務, 包括 Blackboard 網上學習平台, 港專電郵服務, 圖書館電子資料庫及其他教學行政系統.

Figure 1 Microsoft Visio

Java 程式設計基礎班 (7) 劉根豪台大電機所網路資料庫研究室. Java I/O. Class 7 1. Class 7

UNIX Basics + shell commands. Michael Tsai 2017/03/06

JAVA Programming Language Homework V: Overall Review

Version Control with Subversion

Produced by. Mobile Application Development. Higher Diploma in Science in Computer Science. Eamonn de Leastar

MAD ASSIGNMENT NO 2. Submitted by: Rehan Asghar BSSE AUGUST 25, SUBMITTED TO: SIR WAQAS ASGHAR Superior CS&IT Dept.

Twin API Guide. How to use Twin

Android Apps Development for Mobile and Tablet Device (Level I) Lesson 2

Tip Calculator. xmlns:tools=" android:layout_width="match_parent"

Software Architecture Case Study: Applying Layer in SyncFree

一般來說, 安裝 Ubuntu 到 USB 上, 不外乎兩種方式 : 1) 將電腦上的硬碟排線先予以排除, 將 USB 隨身碟插入主機, 以一般光碟安裝方式, 將 Ubuntu 安裝到 USB


Produced by. Mobile Application Development. Higher Diploma in Science in Computer Science. Eamonn de Leastar

49 <script type="text/javascript"> 50 var gcid=0,sex=false,birthday=kendo.tostring(new Date(),"yyyy/MM/dd"); 51 $(function(){ 52

EMBEDDED SYSTEMS PROGRAMMING Application Tip: Managing Screen Orientation

Common Commands in Low-Level File I/O

// 範例 4-1: 連結資料庫 (connectdb.php) <?php mysql_connect("localhost", "student", "Asia2013"); mysql_select_db("student");?>

PENGEMBANGAN APLIKASI PERANGKAT BERGERAK (MOBILE)

Androidプログラミング 2 回目 迫紀徳

全面強化電路設計與模擬驗證. Addi Lin / Graser 2 / Sep / 2016

What is a Better Program?

Syntest Tool 使用說明. Speaker: Yu-Hsien Cheng Adviser: Kuen-Jong Lee. VLSI/CAD Training Course

2009 OB Workshop: Structural Equation Modeling. Changya Hu, Ph.D. NCCU 2009/07/ /07/03

BTC, EMPREX Wireless Keybaord +Mouse + USB dongle. 6309URF III Quick Installation Guide

Frame Relay 訊框中繼 FRSW S0/0 S0/1

EdConnect and EdDATA

MATLAB 結構矩陣 DICOM 資訊與影像對比

Create Parent Activity and pass its information to Child Activity using Intents.

EMBEDDED SYSTEMS PROGRAMMING UI Specification: Approaches

CLAD 考前準備 與 LabVIEW 小技巧

Operating Systems 作業系統

PCU50 的整盘备份. 本文只针对操作系统为 Windows XP 版本的 PCU50 PCU50 启动硬件自检完后, 出现下面文字时, 按向下光标键 光标条停在 SINUMERIK 下方的空白处, 如下图, 按回车键 PCU50 会进入到服务画面, 如下图

TextView Control. EditText Control. TextView Attributes. android:id - This is the ID which uniquely identifies the control.

MAD ASSIGNMENT NO 3. Submitted by: Rehan Asghar BSSE AUGUST 25, SUBMITTED TO: SIR WAQAS ASGHAR Superior CS&IT Dept.

UAK1-C01 USB Interface Data Encryption Lock USB 資料加密鎖. Specifications for Approval

香港中文大學學生會計算機科學系會 圖書清單

ANDROID PROGRAMS DAY 3

EZCast Docking Station

EZCast Wire User s Manual

M.A.D ASSIGNMENT # 2 REHAN ASGHAR BSSE 15126

Preamble Ethernet packet Data FCS

EZCast Wire. User s Manual. Rev. 2.00

EMBEDDED SYSTEMS PROGRAMMING Application Tip: Saving State

第九章結構化查詢語言 SQL - 資料定義語言 (DDL) 資料庫系統設計理論李紹綸著

Fragments. Lecture 11

用於網頁版權保護的資訊隱藏方法. A Steganographic Method for Copyright Protection of Web Pages

描述性資料採礦 Descriptive Data Mining

黃河凱. Kaiser Huang 巨匠電腦北區 / 新竹認證中心認證講師國立新竹教育大學數位學習科技研究所在職生微軟原廠認證講師 MCT

Information is EVERYTHING 微軟企業混和雲解決方案. November 24, Spenser Lin. Cloud Infra Solution Sales, Microsoft Taiwan

3.1 Animation. Rotating Square

4Affirma Analog Artist Design Flow

Mobile Application Development Lab [] Simple Android Application for Native Calculator. To develop a Simple Android Application for Native Calculator.

外薦交換生線上申請系統操作說明 Instruction on Exchange Student Online Application System. [ 中文版 ] [English Version]

Chapter 7. Digital Arithmetic and Arithmetic Circuits. Signed/Unsigned Binary Numbers

EMBEDDED SYSTEMS PROGRAMMING Android Services

虛擬機 - 惡意程式攻防的新戰場. 講師簡介王大寶, 小時候大家叫他王小寶, 長大後就稱王大寶, 目前隸屬一神祕單位. 雖然佯稱興趣在看書與聽音樂, 但是其實晚上都在打 Game. 長期於系統最底層打滾, 熟悉 ASM,C/C++,

微算機原理與實驗 Principle of Microcomputer(UEE 2301/1071 )

購票流程說明 How To purchase The Ticket?

InTANK ir2622 User Manual

The notice regarding Participation Ways of our global distributor video conference on Feb. 5.

Use of SCTP for Handoff and Path Selection Strategy in Wireless Network

多元化資料中心 的保護策略 技術顧問 陳力維

VMware vsphere. 零壹科技 Josh.wang VMware Inc. All rights reserved

Android UI Development

微處理機系統 吳俊興高雄大學資訊工程學系. February 21, What are microprocessors (µp)? What are the topics of this course? Why to take this course?

私有雲公有雲的聯合出擊 領先的運算, 儲存與網路虛擬化技術 靈活的計費模式與經濟性 支援廣大的商業應用場景 涵蓋各類型雲服務 類標準的企業資料中心架構 全球規模與快速部署. 聯合設計的解決方案可為客戶提供最佳的 VMware 和 AWS

InTANK ir2623-s3 User Manual

Fragment Example Create the following files and test the application on emulator or device.

SOHOTANK PD3500+ User Manual

Quick Installation Guide for Connectivity Adapter Cable CA-42

HDD Integration and Technology challenges to CE Products 消費電子産品中硬碟的應用 與技術瓶頸

C B A B B C C C C A B B A B C D A D D A A B D C C D D A B D A D C D B D A C A B

場次 : C3. 公司名稱 : Radware. 主題 : ADC & Security for SDDC. 主講人 : Sam Lin ( 職稱 ) 總經理

ELET4133: Embedded Systems. Topic 15 Sensors

SD Module-1 Android Dvelopment

South Africa

游家德 Jade Freeman 群智信息 / 敦群數位資深架構顧問

Sequential Search. n 1 2. Example 44, 55, 12, 42, 94, 18, 06, 67 Unsuccessful search. Successful search. n+1 CHAPTER 7 2

VIEW VOLUME & CLPPING

購票流程說明 How To purchase The Ticket?

InTANK ir2771-s3 ir2772-s3. User Manual

利用數據與軟體瞭解 讀者行為使用分析與服務平台選項

Allegro SPB V16 Advance

Lotusphere Comes to You 輕鬆打造 Web 2.0 入口網站 IBM Corporation

打造新世代企業資料中心 Windows Server 2016 重裝登場. 馮立偉 Hybrid Cloud Lead Microsoft Taiwan

Chapter 4 (Part IV) The Processor: Datapath and Control (Parallelism and ILP)

Practical Experience on CUDA

Transcription:

使用 TensorFlow 設計矩陣乘法計算並轉移執行在 Android 上 建國科技大學資管系 饒瑞佶 2017/8

Python 設計 Model import tensorflow as tf from tensorflow.python.tools import freeze_graph from tensorflow.python.tools import optimize_for_inference_lib I=tf.placeholder(tf.float32,shape=[None,3],name="I") # input W=tf.Variable(tf.zeros(shape=[3,2]),dtype=tf.float32,name="W") # weights b=tf.variable(tf.zeros(shape=[2]),dtype=tf.float32,name="b") #bias o=tf.nn.relu(tf.matmul(i,w)+b,name="final_result") # activation / output # o= I * W + b saver=tf.train.saver() init_op=tf.global_variables_initializer()

with tf.session() as sess: sess.run(init_op) #save the graph tf.train.write_graph(sess.graph_def,'.','tfdroid.pbtxt') #normally you would do some training here # but for now we will just assign something to W sess.run(tf.assign(w,[[1,2],[3,4],[5,6]])) sess.run(tf.assign(b,[1,1])) saver.save(sess,'./tfdroid.ckpt')

MODEL_NAME='tfdroid' #freeze the graph input_graph_path= MODEL_NAME + '.pbtxt' checkpoint_path='./' + MODEL_NAME + '.ckpt' input_saver_def_path="" input_binary=false output_node_names="final_result" restore_op_name="save/restore_all" filename_tensor_name="save/const:0" output_frozen_graph_name='frozen_' + MODEL_NAME + '.pb' output_optimized_graph_name='optimized_' + MODEL_NAME + '.pb' clear_devices=true freeze_graph.freeze_graph(input_graph_path,input_saver_def_path,input_binary,checkpoin t_path,output_node_names,restore_op_name,filename_tensor_name,output_frozen_graph _name,clear_devices,"")

#optimize for inference input_graph_def=tf.graphdef() with tf.gfile.open(output_frozen_graph_name,"rb") as f: data=f.read() input_graph_def.parsefromstring(data) output_graph_def=optimize_for_inference_lib.optimize_for_inference(input_graph_def, ["I"],["final_result"],tf.float32.as_datatype_enum) #Save the optimized graph f=tf.gfile.fastgfile(output_optimized_graph_name,"w") f.write(output_graph_def.serializetostring())

轉移到 Android 透過.pb 模型檔案

New Android Project

Empty Activity

加入 assets 目錄與.pb 檔案

加入.pb 檔案

使用 nightly build package https://ci.tensorflow.org/view/nightly/job/nightly-android/ 找 #44 版本

使用方式 1. 複製 libandroid_tensorflow_inference_java.jar 與 libtensorflow_inference.so 目錄內的子目錄到專案的 libs 目錄中

result

使用方式 2. 修改 build.gradle(app), 在 android 段加入 sourcesets { main { jnilibs.srcdirs = ['libs'] } }

Android 專案結構

layout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context="com.example.rueychi.tf_to_android.mainactivity"> <EditText android:layout_width="100dp" android:layout_height="wrap_content" android:inputtype="textpersonname" android:text="2.3" android:ems="10" android:id="@+id/editnum1" android:layout_margintop="24dp" android:layout_marginstart="16dp" android:layout_alignparenttop="true" android:layout_alignparentstart="true" />

<EditText android:layout_height="wrap_content" android:inputtype="textpersonname" android:text="33" android:ems="10" android:id="@+id/editnum2" android:layout_width="100dp" android:layout_alignbaseline="@+id/editnum1" android:layout_alignbottom="@+id/editnum1" android:layout_centerhorizontal="true" /> <Button android:text="run" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button" android:layout_below="@+id/editnum2" android:layout_centerhorizontal="true" android:layout_margintop="50dp" />

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="output" android:id="@+id/txtviewresult" android:layout_margintop="85dp" android:textalignment="center" android:layout_aligntop="@+id/button" android:layout_centerhorizontal="true" /> <EditText android:layout_height="wrap_content" android:inputtype="textpersonname" android:text="12" android:ems="10" android:id="@+id/editnum3" android:layout_width="100dp" android:layout_marginstart="11dp" android:layout_alignbaseline="@+id/editnum2" android:layout_alignbottom="@+id/editnum2" android:layout_toendof="@+id/editnum2" /> </RelativeLayout>

MainActivity.java

載入.so 檔案

code // 使用 Python 建立的.pb model private static final String MODEL_FILE = "file:///android_asset/optimized_tfdroid.pb"; private static final String INPUT_NODE = "I"; // 對應 Python 中的名稱 private static final String OUTPUT_NODE = final_result";// 對應 Python 中的名稱 private static final int[] INPUT_SIZE = {1,3};// 設定輸入的大小 // 透過 TensorFlowInferenceInterface 建立 TensorFlow 物件 ( 來自.jar 檔案 ) private TensorFlowInferenceInterface inferenceinterface; // 載入.so 檔案 static { System.loadLibrary("tensorflow_inference"); }

@Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // 建立 tensorflow 物件 inferenceinterface = new TensorFlowInferenceInterface(); // 透過 tensorflow 物件載入.pb 模型 inferenceinterface.initializetensorflow(getassets(), MODEL_FILE);

final Button button = (Button) findviewbyid(r.id.button); button.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { // 輸入的 3 個資料 final EditText editnum1 = (EditText) findviewbyid(r.id.editnum1); final EditText editnum2 = (EditText) findviewbyid(r.id.editnum2); final EditText editnum3 = (EditText) findviewbyid(r.id.editnum3); float num1 = Float.parseFloat(editNum1.getText().toString()); float num2 = Float.parseFloat(editNum2.getText().toString()); float num3 = Float.parseFloat(editNum3.getText().toString()); // Input I tensor float[] inputfloats = {num1, num2, num3}; // 將 I 輸入到 tensorflow inferenceinterface.fillnodefloat(input_node, INPUT_SIZE, inputfloats); // 開始執行 model inferenceinterface.runinference(new String[]{OUTPUT_NODE}); // 輸出 tensor float[] resu = {0, 0}; // 讀出結果 O inferenceinterface.readnodefloat(output_node, resu); // 顯示結果 final TextView textviewr = (TextView) findviewbyid(r.id.txtviewresult); textviewr.settext(float.tostring(resu[0]) + ", " + Float.toString(resu[1])); } });

可以試試回去 Python 改 原來 o=tf.nn.relu(tf.matmul(i,w)+b,name="final_result") 改成 o=tf.nn.relu(tf.matmul(i,w)*b,name="final_result") 重新執行看看結果