บทช่วยสอนนี้จะแสดงวิธีสร้างแอปพลิเคชัน Android โดยใช้ TensorFlow Lite เพื่อจัดประเภทข้อความที่เป็นภาษาธรรมชาติ แอปพลิเคชันนี้ออกแบบมาสำหรับอุปกรณ์ Android จริง แต่สามารถทำงานบนอุปกรณ์จำลองได้
แอปพลิเคชันตัวอย่าง ใช้ TensorFlow Lite เพื่อจัดประเภทข้อความเป็นเชิงบวกหรือเชิงลบ โดยใช้ ไลบรารีงานสำหรับภาษาธรรมชาติ (NL) เพื่อเปิดใช้งานการดำเนินการโมเดลการเรียนรู้ของเครื่องจำแนกข้อความ
หากคุณกำลังอัปเดตโปรเจ็กต์ที่มีอยู่ คุณสามารถใช้แอปพลิเคชันตัวอย่างเป็นข้อมูลอ้างอิงหรือเทมเพลตได้ สำหรับคำแนะนำเกี่ยวกับวิธีการเพิ่มการจัดหมวดหมู่ข้อความให้กับแอปพลิเคชันที่มีอยู่ โปรดดูที่ การอัปเดตและการแก้ไขแอปพลิเคชันของคุณ
ภาพรวมการจัดหมวดหมู่ข้อความ
การจัดหมวดหมู่ข้อความ เป็นงานการเรียนรู้ของเครื่องในการกำหนดชุดหมวดหมู่ที่กำหนดไว้ล่วงหน้าให้กับข้อความปลายเปิด แบบจำลองการจัดประเภทข้อความได้รับการฝึกฝนเกี่ยวกับคลังข้อความภาษาธรรมชาติ โดยที่คำหรือวลีจะถูกจัดประเภทด้วยตนเอง
โมเดลที่ได้รับการฝึกอบรมจะได้รับข้อความเป็นอินพุตและพยายามจัดหมวดหมู่ข้อความตามชุดของคลาสที่รู้จักซึ่งได้รับการฝึกฝนให้จัดประเภท ตัวอย่างเช่น โมเดลในตัวอย่างนี้ยอมรับตัวอย่างข้อความและกำหนดว่าความรู้สึกของข้อความเป็นบวกหรือลบ สำหรับแต่ละส่วนของข้อความ โมเดลการจัดประเภทข้อความจะแสดงคะแนนที่บ่งชี้ความเชื่อมั่นของข้อความที่ถูกจัดประเภทอย่างถูกต้องว่าเป็นเชิงบวกหรือเชิงลบ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการสร้างโมเดลในบทช่วยสอนนี้ โปรดดูบท ช่วยสอนการจัดหมวดหมู่ข้อความด้วย TensorFlow Lite Model Maker
โมเดลและชุดข้อมูล
บทช่วยสอนนี้ใช้แบบจำลองที่ได้รับการฝึกโดยใช้ชุดข้อมูล SST-2 (Stanford Sentiment Treebank) SST-2 ประกอบด้วยบทวิจารณ์ภาพยนตร์ 67,349 รายการสำหรับการฝึกอบรม และบทวิจารณ์ภาพยนตร์ 872 รายการสำหรับการทดสอบ โดยแต่ละบทวิจารณ์แบ่งออกเป็นเชิงบวกหรือเชิงลบ โมเดลที่ใช้ในแอปนี้ได้รับการฝึกฝนโดยใช้เครื่องมือ TensorFlow Lite Model Maker
แอปพลิเคชันตัวอย่างใช้โมเดลที่ได้รับการฝึกล่วงหน้าต่อไปนี้:
Average Word Vector (
NLClassifier
) -NLClassifier
ของไลบรารีงานจะจัดประเภทข้อความอินพุตเป็นหมวดหมู่ต่างๆ และสามารถรองรับโมเดลการจัดหมวดหมู่ข้อความส่วนใหญ่ได้MobileBERT (
BertNLClassifier
) -BertNLClassifier
ของ Task Library นั้นคล้ายคลึงกับ NLClassifier แต่ได้รับการปรับแต่งสำหรับกรณีที่ต้องใช้โทเค็นของ Wordpiece และ Sentencepiece ที่ไม่อยู่ในกราฟ
ตั้งค่าและเรียกใช้แอปตัวอย่าง
หากต้องการตั้งค่าแอปพลิเคชันการจัดประเภทข้อความ ให้ดาวน์โหลดแอปตัวอย่างจาก GitHub และเรียกใช้โดยใช้ Android Studio
ความต้องการของระบบ
- Android Studio เวอร์ชัน 2021.1.1 (Bumblebee) หรือสูงกว่า
- Android SDK เวอร์ชัน 31 ขึ้นไป
- อุปกรณ์ Android ที่มีระบบปฏิบัติการเวอร์ชันขั้นต่ำ SDK 21 (Android 7.0 - Nougat) พร้อมเปิดใช้งาน โหมดนักพัฒนาซอฟต์แวร์ หรือ Android Emulator
รับโค้ดตัวอย่าง
สร้างสำเนาโค้ดตัวอย่างในเครื่อง คุณจะใช้โค้ดนี้เพื่อสร้างโปรเจ็กต์ใน Android Studio และเรียกใช้แอปพลิเคชันตัวอย่าง
หากต้องการโคลนและตั้งค่าโค้ดตัวอย่าง:
- โคลนที่เก็บ git
git clone https://github.com/tensorflow/examples.git
- คุณสามารถเลือกกำหนดค่าอินสแตนซ์ git ของคุณเพื่อใช้การชำระเงินแบบกระจาย ดังนั้นคุณจึงมีเฉพาะไฟล์สำหรับแอปตัวอย่างการจัดหมวดหมู่ข้อความ:
cd examples git sparse-checkout init --cone git sparse-checkout set lite/examples/text_classification/android
นำเข้าและรันโครงการ
สร้างโปรเจ็กต์จากโค้ดตัวอย่างที่ดาวน์โหลด สร้างโปรเจ็กต์ จากนั้นรัน
หากต้องการนำเข้าและสร้างโปรเจ็กต์โค้ดตัวอย่าง:
- เริ่ม Android สตูดิโอ
- จาก Android Studio ให้เลือก File > New > Import Project
- นำทางไปยังไดเร็กทอรีโค้ดตัวอย่างที่มีไฟล์ build.gradle (
.../examples/lite/examples/text_classification/android/build.gradle
) และเลือกไดเร็กทอรีนั้น - หาก Android Studio ขอ Gradle Sync ให้เลือกตกลง
- ตรวจสอบให้แน่ใจว่าอุปกรณ์ Android ของคุณเชื่อมต่อกับคอมพิวเตอร์และเปิดใช้งานโหมดนักพัฒนาซอฟต์แวร์แล้ว คลิกลูก
Run
สีเขียว
หากคุณเลือกไดเร็กทอรีที่ถูกต้อง Android Studio จะสร้างโปรเจ็กต์ใหม่และสร้างมันขึ้นมา กระบวนการนี้อาจใช้เวลาสักครู่ ขึ้นอยู่กับความเร็วของคอมพิวเตอร์ และหากคุณใช้ Android Studio สำหรับโปรเจ็กต์อื่นหรือไม่ เมื่อการสร้างเสร็จสมบูรณ์ Android Studio จะแสดงข้อความ BUILD SUCCESSFUL
ในแผงสถานะ Build Output
ในการดำเนินโครงการ:
- จาก Android Studio ให้รันโปรเจ็กต์โดยเลือก Run > Run…
- เลือกอุปกรณ์ Android (หรือโปรแกรมจำลอง) ที่แนบมาเพื่อทดสอบแอป
การใช้แอพพลิเคชั่น
หลังจากรันโปรเจ็กต์ใน Android Studio แอปพลิเคชันจะเปิดขึ้นโดยอัตโนมัติบนอุปกรณ์ที่เชื่อมต่อหรือโปรแกรมจำลองอุปกรณ์
หากต้องการใช้ตัวแยกประเภทข้อความ:
- ป้อนตัวอย่างข้อความในกล่องข้อความ
- จากดรอปดาวน์ Delegate ให้เลือก
CPU
หรือNNAPI
- ระบุโมเดลโดยเลือก
AverageWordVec
หรือMobileBERT
- เลือก จำแนกประเภท
แอปพลิเคชันให้ผลลัพธ์เป็นคะแนน บวก และคะแนน ลบ คะแนนทั้งสองนี้จะรวมกันเป็น 1 และวัดความเป็นไปได้ที่ความรู้สึกของข้อความที่ป้อนจะเป็นเชิงบวกหรือเชิงลบ ตัวเลขที่สูงกว่าหมายถึงระดับความมั่นใจที่สูงขึ้น
ขณะนี้คุณมีแอปพลิเคชันการจัดประเภทข้อความที่ใช้งานได้แล้ว ใช้ส่วนต่อไปนี้เพื่อทำความเข้าใจวิธีการทำงานของแอปพลิเคชันตัวอย่างให้ดียิ่งขึ้น และวิธีการใช้คุณลักษณะการจัดหมวดหมู่ข้อความกับแอปพลิเคชันที่ใช้งานจริงของคุณ:
วิธีการทำงานของแอปพลิเคชัน - บทสรุปเกี่ยวกับโครงสร้างและไฟล์สำคัญของแอปพลิเคชันตัวอย่าง
แก้ไขแอปพลิเคชันของคุณ - คำแนะนำในการเพิ่มการจัดหมวดหมู่ข้อความให้กับแอปพลิเคชันที่มีอยู่
แอปตัวอย่างทำงานอย่างไร
แอปพลิเคชันใช้ ไลบรารีงานสำหรับแพ็คเกจภาษาธรรมชาติ (NL) เพื่อใช้แบบจำลองการจัดหมวดหมู่ข้อความ ทั้งสองโมเดล ได้แก่ Average Word Vector และ MobileBERT ได้รับการฝึกโดยใช้ TensorFlow Lite Model Maker แอปพลิเคชันทำงานบน CPU ตามค่าเริ่มต้น พร้อมตัวเลือกในการเร่งความเร็วด้วยฮาร์ดแวร์โดยใช้ตัวแทน NNAPI
ไฟล์และไดเร็กทอรีต่อไปนี้มีรหัสสำคัญสำหรับแอปพลิเคชันการจัดประเภทข้อความนี้:
- TextClassificationHelper.kt - เตรียมใช้งานตัวแยกประเภทข้อความและจัดการการเลือกโมเดลและผู้รับมอบสิทธิ์
- MainActivity.kt - ใช้งานแอปพลิเคชัน รวมถึงการเรียก
TextClassificationHelper
และResultsAdapter
- ResultsAdapter.kt - จัดการและจัดรูปแบบผลลัพธ์
แก้ไขใบสมัครของคุณ
ส่วนต่อไปนี้อธิบายขั้นตอนสำคัญในการแก้ไขแอป Android ของคุณเองเพื่อรันโมเดลที่แสดงในแอปตัวอย่าง คำแนะนำเหล่านี้ใช้แอปตัวอย่างเป็นจุดอ้างอิง การเปลี่ยนแปลงเฉพาะที่จำเป็นสำหรับแอปของคุณอาจแตกต่างกันไปจากแอปตัวอย่าง
เปิดหรือสร้างโครงการ Android
คุณต้องมีโครงการพัฒนา Android ใน Android Studio เพื่อปฏิบัติตามคำแนะนำที่เหลือ ทำตามคำแนะนำด้านล่างเพื่อเปิดโปรเจ็กต์ที่มีอยู่หรือสร้างโปรเจ็กต์ใหม่
หากต้องการเปิดโครงการพัฒนา Android ที่มีอยู่:
- ใน Android Studio ให้เลือก ไฟล์ > เปิด และเลือกโปรเจ็กต์ที่มีอยู่
ในการสร้างโครงการพัฒนา Android ขั้นพื้นฐาน:
- ทำตามคำแนะนำใน Android Studio เพื่อ สร้างโปรเจ็กต์พื้นฐาน
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Android Studio โปรดดู เอกสารประกอบของ Android Studio
เพิ่มการพึ่งพาโครงการ
ในแอปพลิเคชันของคุณเอง คุณต้องเพิ่มการพึ่งพาโปรเจ็กต์เฉพาะเพื่อรันโมเดลแมชชีนเลิร์นนิงของ TensorFlow Lite และเข้าถึงฟังก์ชันยูทิลิตี้ที่แปลงข้อมูล เช่น สตริง ให้เป็นรูปแบบข้อมูลเทนเซอร์ที่โมเดลที่คุณใช้ประมวลผลได้
คำแนะนำต่อไปนี้จะอธิบายวิธีเพิ่มการขึ้นต่อกันของโปรเจ็กต์และโมดูลที่จำเป็นให้กับโปรเจ็กต์แอป Android ของคุณเอง
ในการเพิ่มการพึ่งพาโมดูล:
ในโมดูลที่ใช้ TensorFlow Lite ให้อัปเดตไฟล์
build.gradle
ของโมดูลเพื่อรวมการอ้างอิงต่อไปนี้ในแอปพลิเคชันตัวอย่าง การขึ้นต่อกันจะอยู่ใน app/build.gradle :
dependencies { ... implementation 'org.tensorflow:tensorflow-lite-task-text:0.4.0' }
โครงการจะต้องมีไลบรารีงานข้อความ (
tensorflow-lite-task-text
)หากคุณต้องการแก้ไขแอปนี้ให้ทำงานบนหน่วยประมวลผลกราฟิก (GPU) ไลบรารี GPU (
tensorflow-lite-gpu-delegate-plugin
) จะจัดเตรียมโครงสร้างพื้นฐานเพื่อเรียกใช้แอปบน GPU และ Delegate (tensorflow-lite-gpu
) แสดงรายการความเข้ากันได้ การเรียกใช้แอปนี้บน GPU อยู่นอกขอบเขตของบทช่วยสอนนี้ใน Android Studio ให้ซิงค์การขึ้นต่อกันของโปรเจ็กต์โดยเลือก: ไฟล์ > ซิงค์โปรเจ็กต์กับไฟล์ Gradle
เริ่มต้นโมเดล ML
ในแอป Android คุณต้องเริ่มต้นโมเดลแมชชีนเลิร์นนิง TensorFlow Lite ด้วยพารามิเตอร์ก่อนที่จะเรียกใช้การคาดการณ์ด้วยโมเดล
โมเดล TensorFlow Lite จะถูกจัดเก็บเป็นไฟล์ *.tflite
ไฟล์โมเดลประกอบด้วยตรรกะการทำนาย และโดยทั่วไปจะมี ข้อมูลเมตา เกี่ยวกับวิธีตีความผลลัพธ์การทำนาย เช่น ชื่อคลาสการทำนาย โดยทั่วไป ไฟล์โมเดลจะถูกจัดเก็บไว้ในไดเร็กทอรี src/main/assets
ของโปรเจ็กต์การพัฒนาของคุณ ดังตัวอย่างโค้ด:
-
<project>/src/main/assets/mobilebert.tflite
-
<project>/src/main/assets/wordvec.tflite
เพื่อความสะดวกและความสามารถในการอ่านโค้ด ตัวอย่างจะประกาศออบเจ็กต์ที่แสดงร่วมกันซึ่งกำหนดการตั้งค่าสำหรับโมเดล
ในการเริ่มต้นโมเดลในแอปของคุณ:
สร้างออบเจ็กต์ร่วมเพื่อกำหนดการตั้งค่าสำหรับโมเดล ในแอปพลิเคชันตัวอย่าง อ็อบเจ็กต์นี้จะอยู่ใน TextClassificationHelper.kt :
companion object { const val DELEGATE_CPU = 0 const val DELEGATE_NNAPI = 1 const val WORD_VEC = "wordvec.tflite" const val MOBILEBERT = "mobilebert.tflite" }
สร้างการตั้งค่าสำหรับโมเดลโดยการสร้างออบเจ็กต์ตัวแยกประเภท และสร้างออบเจ็กต์ TensorFlow Lite โดยใช้
BertNLClassifier
หรือNLClassifier
ในแอปพลิเคชันตัวอย่าง สิ่งนี้จะอยู่ในฟังก์ชัน
initClassifier
ภายใน TextClassificationHelper.kt :fun initClassifier() { ... if( currentModel == MOBILEBERT ) { ... bertClassifier = BertNLClassifier.createFromFileAndOptions( context, MOBILEBERT, options) } else if (currentModel == WORD_VEC) { ... nlClassifier = NLClassifier.createFromFileAndOptions( context, WORD_VEC, options) } }
เปิดใช้งานการเร่งด้วยฮาร์ดแวร์ (ไม่จำเป็น)
เมื่อเริ่มต้นโมเดล TensorFlow Lite ในแอปของคุณ คุณควรพิจารณาใช้ฟีเจอร์การเร่งด้วยฮาร์ดแวร์เพื่อเพิ่มความเร็วในการคำนวณการคาดการณ์ของโมเดล ผู้ร่วมประชุม TensorFlow Lite คือโมดูลซอฟต์แวร์ที่เร่งการดำเนินการโมเดลการเรียนรู้ของเครื่องโดยใช้ฮาร์ดแวร์การประมวลผลเฉพาะทางบนอุปกรณ์เคลื่อนที่ เช่น หน่วยประมวลผลกราฟิก (GPU) หรือหน่วยประมวลผลเทนเซอร์ (TPU)
หากต้องการเปิดใช้งานการเร่งด้วยฮาร์ดแวร์ในแอปของคุณ:
สร้างตัวแปรเพื่อกำหนดผู้รับมอบสิทธิ์ที่แอปพลิเคชันจะใช้ ในแอปพลิเคชันตัวอย่าง ตัวแปรนี้อยู่ที่ช่วงต้นของ TextClassificationHelper.kt :
var currentDelegate: Int = 0
สร้างตัวเลือกผู้รับมอบสิทธิ์ ในแอปพลิเคชันตัวอย่าง ตัวเลือกผู้รับมอบสิทธิ์จะอยู่ในฟังก์ชัน
initClassifier
ภายใน TextClassificationHelper.kt :val baseOptionsBuilder = BaseOptions.builder() when (currentDelegate) { DELEGATE_CPU -> { // Default } DELEGATE_NNAPI -> { baseOptionsBuilder.useNnapi() } }
แนะนำให้ใช้ผู้รับมอบสิทธิ์เพื่อเรียกใช้โมเดล TensorFlow Lite แต่ไม่จำเป็น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ผู้ร่วมประชุมกับ TensorFlow Lite โปรดดูที่ TensorFlow Lite Delegates
เตรียมข้อมูลสำหรับโมเดล
ในแอป Android โค้ดของคุณจะให้ข้อมูลแก่โมเดลสำหรับการตีความโดยการแปลงข้อมูลที่มีอยู่ เช่น ข้อความดิบ ให้เป็นรูปแบบข้อมูล Tensor ที่โมเดลของคุณสามารถประมวลผลได้ ข้อมูลในเทนเซอร์ที่คุณส่งไปยังโมเดลจะต้องมีขนาดหรือรูปร่างเฉพาะที่ตรงกับรูปแบบของข้อมูลที่ใช้ในการฝึกโมเดล
แอปจัดหมวดหมู่ข้อความนี้ยอมรับ สตริง เป็นอินพุต และโมเดลจะได้รับการฝึกอบรมเฉพาะในคลังข้อมูลภาษาอังกฤษ อักขระพิเศษและคำที่ไม่ใช่ภาษาอังกฤษจะถูกละเว้นในระหว่างการอนุมาน
ในการจัดเตรียมข้อมูลข้อความให้กับโมเดล:
ตรวจสอบให้แน่ใจว่าฟังก์ชัน
initClassifier
มีโค้ดสำหรับผู้รับมอบสิทธิ์และโมเดล ตามที่อธิบายไว้ในส่วน เริ่มต้นโมเดล ML และ เปิดใช้งานการเร่งด้วยฮาร์ดแวร์ใช้บล็อก
init
เพื่อเรียกใช้ฟังก์ชันinitClassifier
ในแอปพลิเคชันตัวอย่างinit
จะอยู่ใน TextClassificationHelper.kt :init { initClassifier() }
เรียกใช้การคาดการณ์
ในแอป Android ของคุณ เมื่อคุณเริ่มต้นวัตถุ BertNLClassifier หรือ NLClassifier แล้ว คุณสามารถเริ่มป้อนข้อความอินพุตสำหรับโมเดลเพื่อจัดหมวดหมู่เป็น "บวก" หรือ "ลบ"
หากต้องการเรียกใช้การคาดการณ์:
สร้างฟังก์ชัน
classify
ซึ่งใช้ตัวแยกประเภทที่เลือก (currentModel
) และวัดเวลาที่ใช้ในการจัดประเภทข้อความอินพุต (inferenceTime
) ในแอปพลิเคชันตัวอย่าง ฟังก์ชันclassify
จะอยู่ใน TextClassificationHelper.kt :fun classify(text: String) { executor = ScheduledThreadPoolExecutor(1) executor.execute { val results: List<Category> // inferenceTime is the amount of time, in milliseconds, that it takes to // classify the input text. var inferenceTime = SystemClock.uptimeMillis() // Use the appropriate classifier based on the selected model if(currentModel == MOBILEBERT) { results = bertClassifier.classify(text) } else { results = nlClassifier.classify(text) } inferenceTime = SystemClock.uptimeMillis() - inferenceTime listener.onResult(results, inferenceTime) } }
ส่งผ่านผลลัพธ์จาก
classify
ไปยังวัตถุผู้ฟังfun classify(text: String) { ... listener.onResult(results, inferenceTime) }
จัดการเอาต์พุตโมเดล
หลังจากที่คุณป้อนบรรทัดข้อความ แบบจำลองจะสร้างคะแนนการคาดการณ์ ซึ่งแสดงเป็นแบบทศนิยม ระหว่าง 0 ถึง 1 สำหรับหมวดหมู่ 'บวก' และ 'เชิงลบ'
หากต้องการรับผลลัพธ์การทำนายจากแบบจำลอง:
สร้างฟังก์ชัน
onResult
สำหรับออบเจ็กต์ Listener เพื่อจัดการเอาต์พุต ในแอปพลิเคชันตัวอย่าง ออบเจ็กต์ Listener จะอยู่ใน MainActivity.ktprivate val listener = object : TextClassificationHelper.TextResultsListener { override fun onResult(results: List<Category>, inferenceTime: Long) { runOnUiThread { activityMainBinding.bottomSheetLayout.inferenceTimeVal.text = String.format("%d ms", inferenceTime) adapter.resultsList = results.sortedByDescending { it.score } adapter.notifyDataSetChanged() } } ... }
เพิ่มฟังก์ชัน
onError
ให้กับออบเจ็กต์ Listener เพื่อจัดการข้อผิดพลาด:private val listener = object : TextClassificationHelper.TextResultsListener { ... override fun onError(error: String) { Toast.makeText(this@MainActivity, error, Toast.LENGTH_SHORT).show() } }
เมื่อแบบจำลองส่งคืนชุดผลลัพธ์การคาดการณ์แล้ว แอปพลิเคชันของคุณสามารถดำเนินการตามการคาดการณ์เหล่านั้นได้โดยการนำเสนอผลลัพธ์แก่ผู้ใช้ของคุณหรือดำเนินการตรรกะเพิ่มเติม แอปพลิเคชันตัวอย่างแสดงรายการคะแนนการทำนายในส่วนติดต่อผู้ใช้
ขั้นตอนถัดไป
- ฝึกฝนและปรับใช้โมเดลตั้งแต่เริ่มต้นด้วย การจัดหมวดหมู่ข้อความด้วยบทช่วยสอน TensorFlow Lite Model Maker
- สำรวจ เครื่องมือประมวลผลข้อความเพิ่มเติมสำหรับ TensorFlow
- ดาวน์โหลด BERT รุ่นอื่นๆ บน TensorFlow Hub
- สำรวจการใช้งานต่างๆ ของ TensorFlow Lite ใน ตัวอย่าง
- เรียนรู้เพิ่มเติมเกี่ยวกับการใช้โมเดล Machine Learning กับ TensorFlow Lite ในส่วน โมเดล
- เรียนรู้เพิ่มเติมเกี่ยวกับการนำแมชชีนเลิร์นนิงไปใช้ในแอปพลิเคชันมือถือของคุณใน คู่มือนักพัฒนา TensorFlow Lite