คลาสย่อยโดยอ้อมที่รู้จัก |
อินเทอร์เฟซกับอินเทอร์พรีเตอร์โมเดล TensorFlow Lite ไม่รวมวิธีการทดลอง
อินสแตนซ์ InterpreterApi
จะสรุปโมเดล TensorFlow Lite ที่ฝึกล่วงหน้า โดยที่
จะดำเนินการสำหรับการอนุมานโมเดล
ตัวอย่างเช่น หากโมเดลรับอินพุตเพียง 1 อินพุตและแสดงผลเพียง 1 เอาต์พุต
try (InterpreterApi interpreter =
new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
หากโมเดลมีอินพุตหรือเอาต์พุตหลายรายการ ให้ทำดังนี้
Object[] inputs = {input0, input1, ...};
Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
FloatBuffer ith_output = FloatBuffer.allocateDirect(3 * 2 * 4); // Float tensor, shape 3x2x4.
ith_output.order(ByteOrder.nativeOrder());
map_of_indices_to_outputs.put(i, ith_output);
try (InterpreterApi interpreter =
new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
}
หากโมเดลใช้หรือสร้าง Tensor สตริง ให้ทำดังนี้
String[] input = {"foo", "bar"}; // Input tensor shape is [2].
String[][] output = new String[3][2]; // Output tensor shape is [3, 2].
try (InterpreterApi interpreter =
new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(input, output);
}
โปรดทราบว่ารูปร่าง [] และรูปร่าง[1] มีความแตกต่าง สำหรับ Tensor สตริงสเกลาร์ เอาต์พุต:
String[] input = {"foo"}; // Input tensor shape is [1].
ByteBuffer outputBuffer = ByteBuffer.allocate(OUTPUT_BYTES_SIZE); // Output tensor shape is [].
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(input, outputBuffer);
}
byte[] outputBytes = new byte[outputBuffer.remaining()];
outputBuffer.get(outputBytes);
// Below, the `charset` can be StandardCharsets.UTF_8.
String output = new String(outputBytes, charset);
ระบบจะกำหนดลำดับของอินพุตและเอาต์พุตเมื่อแปลงโมเดล TensorFlow เป็น TensorFlowLite โมเดลที่มี Toco และมีรูปแบบเริ่มต้นของอินพุต
เมื่อมีการระบุอินพุตเป็นอาร์เรย์ (หลายมิติ) Tensor อินพุตที่เกี่ยวข้องจะ
ปรับขนาดได้ตามรูปร่างของอาร์เรย์นั้นโดยปริยาย เมื่อระบุอินพุตเป็นประเภท Buffer
ระบบจะไม่ปรับขนาดโดยนัย ผู้โทรต้องตรวจสอบให้แน่ใจว่าขนาด Buffer
ไบต์ตรงกับของ Tensor ที่ตรงกันหรือรายการแรก
ปรับขนาด Tensor ผ่าน resizeInput(int, int[])
ข้อมูลรูปร่างและประเภท Tensor สามารถเป็นได้
ได้รับผ่านชั้นเรียน Tensor
ซึ่งมีให้บริการผ่าน getInputTensor(int)
และ getOutputTensor(int)
คำเตือน:InterpreterApi
อินสแตนซ์ไม่ปลอดภัยของชุดข้อความ
คำเตือน: อินสแตนซ์ InterpreterApi
เป็นเจ้าของทรัพยากรที่ต้อง
ว่างอย่างชัดเจนโดยการเรียกใช้ close()
ไลบรารี TFLite สร้างขึ้นโดยเทียบกับ NDK API 19 โดยอาจใช้งานได้สำหรับ Android API ระดับต่ำกว่า 19 แต่ไม่มีการรับประกัน
ชั้นเรียนที่ซ้อนกัน
คลาส | InterpreterApi.Options | คลาสตัวเลือกสำหรับการควบคุมลักษณะการทำงานของล่ามรันไทม์ |
วิธีการสาธารณะ
นามธรรม เป็นโมฆะ |
allocateTensors()
อัปเดตการจัดสรรสำหรับ Tensor ทั้งหมดอย่างชัดแจ้ง หากจำเป็น
|
นามธรรม เป็นโมฆะ |
close()
ปล่อยทรัพยากรที่เชื่อมโยงกับอินสแตนซ์
InterpreterApi |
คงที่ InterpreterApi |
create(ตัวเลือก File modelFile, InterpreterApi.Options)
สร้างอินสแตนซ์
InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ |
คงที่ InterpreterApi |
create(ตัวเลือก ByteBuffer bytesBuffer, InterpreterApi.Options)
สร้างอินสแตนซ์
InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ |
นามธรรม Int | |
นามธรรม Tensor |
getInputTensor(int InputIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีอินพุตที่ระบุ
|
นามธรรม Int |
getInputTensorCount()
รับจำนวน Tensor อินพุต
|
นามธรรม ยาว |
getLastNativeInferenceDurationNanoseconds()
แสดงผลเวลาการอนุมานดั้งเดิม
|
นามธรรม Int | |
นามธรรม Tensor |
getOutputTensor(int exitIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีเอาต์พุตที่ระบุ
|
นามธรรม Int |
getOutputTensorCount()
รับจำนวน Tensor เอาต์พุต
|
นามธรรม เป็นโมฆะ |
resizeInput(int idx, int[] dims, boolean strict)
ปรับขนาดอินพุต idx-th ของโมเดลดั้งเดิมตามความสว่างที่กำหนด
|
นามธรรม เป็นโมฆะ |
resizeInput(int idx, int[] หรี่แสง)
ปรับขนาดอินพุต idx-th ของโมเดลดั้งเดิมตามความสว่างที่กำหนด
|
นามธรรม เป็นโมฆะ | |
นามธรรม เป็นโมฆะ |
runForMultipleInputsOutputs(อินพุต Object[], แมป<จำนวนเต็ม, Object> เอาต์พุต)
เรียกใช้การอนุมานโมเดลหากโมเดลรับอินพุตหลายรายการหรือแสดงผลหลายเอาต์พุต
|
เมธอดที่รับมา
วิธีการสาธารณะ
สาธารณะ นามธรรม เป็นโมฆะ allocateTensors ()
อัปเดตการจัดสรรสำหรับ Tensor ทั้งหมดอย่างชัดแจ้ง หากจำเป็น
การดำเนินการนี้จะเผยแพร่รูปร่างและการจัดสรรหน่วยความจำสำหรับ Tensor อ้างอิงโดยใช้อินพุต รูปร่าง Tensor ตามที่กำหนด
หมายเหตุ: การโทรนี้เป็นแบบ *ไม่บังคับเท่านั้น* การจัดสรร Tensor จะเกิดขึ้นโดยอัตโนมัติในระหว่าง การดำเนินการหากมีการปรับขนาด Tensor อินพุต การเรียกนี้เป็นประโยชน์มากที่สุดในการระบุ รูปร่างสำหรับ Tensor เอาต์พุตก่อนที่จะเรียกใช้กราฟ เช่น
interpreter.resizeInput(0, new int[]{1, 4, 4, 3}));
interpreter.allocateTensors();
FloatBuffer input = FloatBuffer.allocate(interpreter.getInputTensor(0).numElements());
// Populate inputs...
FloatBuffer output = FloatBuffer.allocate(interpreter.getOutputTensor(0).numElements());
interpreter.run(input, output)
// Process outputs...
หมายเหตุ: กราฟบางส่วนมีเอาต์พุตที่มีรูปร่างแบบไดนามิก ซึ่งในกรณีนี้รูปร่างเอาต์พุตอาจไม่ เผยแพร่อย่างสมบูรณ์จนกว่าจะมีการดำเนินการอนุมาน
การขว้าง
IllegalStateException | หากจัดสรร Tensor ของกราฟไม่สำเร็จ |
---|
สาธารณะ นามธรรม เป็นโมฆะ ปิด ()
ปล่อยทรัพยากรที่เชื่อมโยงกับอินสแตนซ์ InterpreterApi
สาธารณะ คงที่ InterpreterApi สร้าง (ไฟล์ modelFile, InterpreterApi.Options)
สร้างอินสแตนซ์ InterpreterApi
โดยใช้โมเดลและตัวเลือกที่ระบุ โมเดล
จะโหลดจากไฟล์
พารามิเตอร์
modelFile | ไฟล์ที่มีโมเดล TF Lite ที่ฝึกไว้แล้วล่วงหน้า |
---|---|
ตัวเลือก | ชุดตัวเลือกสำหรับปรับแต่งลักษณะการทำงานของล่าม |
การขว้าง
IllegalArgumentException | หาก modelFile ไม่ได้เข้ารหัส TensorFlow Lite ที่ถูกต้อง
โมเดล
|
---|
สาธารณะ คงที่ InterpreterApi สร้าง (ByteBuffer ไบต์Buffer, InterpreterApi.Options)
สร้างอินสแตนซ์ InterpreterApi
โดยใช้โมเดลและตัวเลือกที่ระบุ โมเดล
จะอ่านจาก ByteBuffer
พารามิเตอร์
byteBuffer | โมเดล TF Lite ที่ฝึกล่วงหน้าในรูปแบบอนุกรมไบนารี ByteBuffer ควร
ไม่มีการแก้ไขหลังการสร้างอินสแตนซ์ InterpreterApi ByteBuffer อาจเป็น MappedByteBuffer ที่แมปไฟล์โมเดลหน่วยความจำ หรือ
ByteBuffer โดยตรงของ NativeOrder() ที่มีเนื้อหาเป็นไบต์ของโมเดล |
---|---|
ตัวเลือก | ชุดตัวเลือกสำหรับปรับแต่งลักษณะการทำงานของล่าม |
การขว้าง
IllegalArgumentException | หาก byteBuffer ไม่ใช่ MappedByteBuffer หรือ
โดยตรง ByteBuffer ของ NativeOrder
|
---|
สาธารณะ นามธรรม Int getInputIndex (สตริง opName)
รับดัชนีของอินพุตโดยใช้ชื่อการดำเนินการของอินพุต
พารามิเตอร์
opName |
---|
การขว้าง
IllegalArgumentException | หาก opName ไม่ตรงกับอินพุตใดๆ ในโมเดลที่ใช้
เพื่อเริ่มต้นใช้งานล่าม
|
---|
สาธารณะ นามธรรม Tensor getInputTensor (int InputIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีอินพุตที่ระบุ
พารามิเตอร์
inputIndex |
---|
การขว้าง
IllegalArgumentException | หาก inputIndex เป็นค่าลบหรือไม่น้อยกว่าค่า
จำนวนอินพุตโมเดล
|
---|
สาธารณะ นามธรรม Int getInputTensorCount ()
รับจำนวน Tensor อินพุต
สาธารณะ นามธรรม ยาว getLastNativeInferenceDurationNanoseconds ()
แสดงผลเวลาการอนุมานดั้งเดิม
การขว้าง
IllegalArgumentException | หากโมเดลไม่ได้เริ่มต้นโดยล่าม |
---|
สาธารณะ นามธรรม Int getOutputIndex (สตริง opName)
รับดัชนีของเอาต์พุตโดยใช้ชื่อการดำเนินการของเอาต์พุต
พารามิเตอร์
opName |
---|
การขว้าง
IllegalArgumentException | หาก opName ไม่ตรงกับเอาต์พุตในโมเดลที่ใช้
เพื่อเริ่มต้นใช้งานล่าม
|
---|
สาธารณะ นามธรรม Tensor getOutputTensor (int outputIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีเอาต์พุตที่ระบุ
หมายเหตุ: รายละเอียด Tensor เอาต์พุต (เช่น รูปร่าง) อาจไม่มีการป้อนข้อมูลอย่างสมบูรณ์จนกว่าจะเสร็จสิ้นการอนุมาน
จะถูกดำเนินการ หากคุณต้องการรายละเอียดที่อัปเดต *ก่อน* ใช้การอนุมาน (เช่น หลังจากปรับขนาด
Tensor อินพุต ซึ่งอาจทำให้รูปร่าง Tensor เอาต์พุตไม่ถูกต้อง) ให้ใช้ allocateTensors()
เพื่อ
ทริกเกอร์การจัดสรรและการเผยแพร่รูปร่างอย่างชัดเจน โปรดทราบว่าสำหรับกราฟที่มีรูปร่างเอาต์พุต
ที่ขึ้นอยู่กับ *ค่า*อินพุต รูปร่างเอาต์พุตอาจไม่ได้รับการกำหนดโดยสมบูรณ์จนกว่า
การอนุมานการทำงาน
พารามิเตอร์
outputIndex |
---|
การขว้าง
IllegalArgumentException | หาก outputIndex เป็นค่าลบหรือไม่น้อยกว่าค่า
จำนวนเอาต์พุตโมเดล
|
---|
สาธารณะ นามธรรม Int getOutputTensorCount ()
รับจำนวน Tensor เอาต์พุต
สาธารณะ นามธรรม เป็นโมฆะ resizeInput (int idx, int[] ดิม, บูลีน strict)
ปรับขนาดอินพุต idx-th ของโมเดลดั้งเดิมตามความสว่างที่กำหนด
เมื่อ "เข้มงวด" เป็น "จริง" ระบบจะปรับขนาดได้เฉพาะมิติข้อมูลที่ไม่รู้จักเท่านั้น มิติข้อมูลที่ไม่รู้จักคือ ระบุเป็น "-1" ในอาร์เรย์ที่แสดงผลโดย "Tensor.shapeSignature()"
พารามิเตอร์
IDX | |
---|---|
หรี่แสง | |
เข้มงวด |
การขว้าง
IllegalArgumentException | หาก idx เป็นค่าลบหรือไม่น้อยกว่าจำนวนดังกล่าว
อินพุตโมเดล หรือหากเกิดข้อผิดพลาดเมื่อปรับขนาดอินพุต idx-th นอกจากนี้ ข้อผิดพลาด
เกิดขึ้นเมื่อพยายามปรับขนาด tensor ที่มีขนาดคงที่เมื่อ "strict" เป็น True
|
---|
สาธารณะ นามธรรม เป็นโมฆะ resizeInput (int idx, int[] หรี่แสง)
ปรับขนาดอินพุต idx-th ของโมเดลดั้งเดิมตามความสว่างที่กำหนด
พารามิเตอร์
IDX | |
---|---|
หรี่แสง |
การขว้าง
IllegalArgumentException | หาก idx เป็นค่าลบหรือไม่น้อยกว่าจำนวนดังกล่าว
อินพุตโมเดล หรือหากเกิดข้อผิดพลาดเมื่อปรับขนาดอินพุต idx-th
|
---|
สาธารณะ นามธรรม เป็นโมฆะ เรียกใช้ (อินพุตออบเจ็กต์, เอาต์พุต ออบเจ็กต์)
เรียกใช้การอนุมานโมเดลหากโมเดลรับเพียงอินพุตเดียวและมีเอาต์พุตเพียง 1 รายการ
คำเตือน: API จะมีประสิทธิภาพมากขึ้นหาก Buffer
(แนะนำโดยตรง แต่ไม่บังคับ)
ใช้เป็นประเภทข้อมูลอินพุต/เอาต์พุต โปรดพิจารณาใช้ Buffer
เพื่อป้อนและดึงข้อมูล
ข้อมูลขั้นพื้นฐานเพื่อประสิทธิภาพที่ดีขึ้น Buffer
ประเภทที่เป็นรูปธรรมต่อไปนี้
รองรับ
ByteBuffer
- ใช้ได้กับ Tensor ประเภทพื้นฐานใดๆ ที่สำคัญFloatBuffer
- ใช้งานได้กับ Tensor แบบลอยIntBuffer
- ใช้งานได้กับ int32 TensorsLongBuffer
- ใช้งานได้กับ int64 Tensors
Buffer
หรือเป็นอินพุตสเกลาร์พารามิเตอร์
อินพุต | อาร์เรย์หรืออาร์เรย์หลายมิติ หรือ Buffer ของประเภทพื้นฐาน
เช่น int, Flo, Long และ Byte Buffer เป็นทางผ่าน
อินพุตสำหรับประเภทพื้นฐาน ในขณะที่ประเภทสตริงต้องใช้ฟังก์ชัน (หลายมิติข้อมูล)
ของอินพุตของอาร์เรย์ เมื่อใช้ Buffer เนื้อหาจะไม่เปลี่ยนแปลงจนกว่า
การอนุมานโมเดลเสร็จสมบูรณ์แล้ว และผู้โทรต้องตรวจสอบว่า Buffer อยู่ที่
ตำแหน่งการอ่านที่เหมาะสม ค่า null จะใช้ได้ก็ต่อเมื่อผู้โทรใช้
Delegate ที่ช่วยให้จัดการบัฟเฟอร์ได้ และบัฟเฟอร์ดังกล่าวยังเชื่อมโยงกับ
ป้อน Tensor |
---|---|
เอาต์พุต | อาร์เรย์หลายมิติของข้อมูลเอาต์พุต หรือ Buffer ของประเภทพื้นฐาน
เช่น int, Flo, Long และ Byte เมื่อใช้ Buffer ผู้โทรจะต้องตรวจสอบว่า
มีการกำหนดตำแหน่งการเขียนที่เหมาะสม สามารถใช้ค่า Null ได้ ซึ่งมีประโยชน์สำหรับ
ในบางกรณี เช่น หากผู้โทรใช้ Delegate ที่รองรับการบัฟเฟอร์
การทำงานร่วมกัน และบัฟเฟอร์ดังกล่าวยังถูกเชื่อมโยงกับเอาต์พุต Tensor (ดู Interpreter.Options#setAllowBufferHandleOutput(boolean))
หรือถ้ากราฟมีเอาต์พุตที่มีการกำหนดรูปทรงแบบไดนามิก และผู้โทรจะต้องสืบค้นรูปร่างเอาต์พุต Tensor หลังจากที่เรียกใช้การอนุมานแล้ว โดยจะดึงข้อมูลจากเอาต์พุตโดยตรง
tensor (ผ่าน Tensor.asReadOnlyBuffer() ) |
การขว้าง
IllegalArgumentException | หาก input เป็นค่าว่างหรือว่างเปล่า หรือหากเกิดข้อผิดพลาดเมื่อ
การอนุมานการทำงาน |
---|---|
IllegalArgumentException | (เวอร์ชันทดลอง อาจมีการเปลี่ยนแปลง) ถ้าการอนุมานคือ
ถูกขัดจังหวะโดย setCancelled(true)
|
สาธารณะ นามธรรม เป็นโมฆะ runForMultipleInputsOutputs (อินพุต Object[], แมป<Integer, Object> เอาต์พุต)
เรียกใช้การอนุมานโมเดลหากโมเดลรับอินพุตหลายรายการหรือแสดงผลหลายเอาต์พุต
คำเตือน: API จะมีประสิทธิภาพมากกว่าหาก Buffer
(แนะนำโดยตรง แต่ไม่บังคับ)
จะใช้เป็นประเภทข้อมูลอินพุต/เอาต์พุต โปรดพิจารณาใช้ Buffer
เพื่อป้อนและดึงข้อมูล
ข้อมูลขั้นพื้นฐานเพื่อประสิทธิภาพที่ดีขึ้น Buffer
ประเภทที่เป็นรูปธรรมต่อไปนี้
รองรับ
ByteBuffer
- ใช้ได้กับ Tensor ประเภทพื้นฐานใดๆ ที่สำคัญFloatBuffer
- ใช้งานได้กับ Tensor แบบลอยIntBuffer
- ใช้งานได้กับ int32 TensorsLongBuffer
- ใช้งานได้กับ int64 Tensors
Buffer
หรือเป็นอินพุตสเกลาร์
หมายเหตุ: ค่า null
สำหรับองค์ประกอบภายในของ inputs
และ outputs
คือ
อนุญาตเฉพาะเมื่อผู้โทรใช้ Delegate
ที่อนุญาตการทำงานร่วมกันของบัฟเฟอร์ และ
มีการเชื่อมโยงบัฟเฟอร์กับอินพุตหรือเอาต์พุตที่เกี่ยวข้อง Tensor
พารามิเตอร์
อินพุต | อาร์เรย์ของข้อมูลอินพุต อินพุตควรอยู่ในลำดับเดียวกับอินพุตของ
โมเดล อินพุตแต่ละรายการอาจเป็นอาร์เรย์หรืออาร์เรย์หลายมิติ หรือ Buffer ของ
ประเภทพื้นฐาน ได้แก่ int, ทศนิยม, ยาว และไบต์ แนะนำให้ใช้ Buffer
เพื่อส่งข้อมูลอินพุตขนาดใหญ่ ในขณะที่ประเภทสตริงต้องใช้อาร์เรย์ (หลายมิติข้อมูล)
เส้นทางอินพุต เมื่อใช้ Buffer เนื้อหาไม่ควรเปลี่ยนแปลงจนกว่าโมเดล
ได้ดำเนินการอนุมานแล้ว และผู้โทรต้องตรวจสอบว่า Buffer เป็นไปตาม
ตำแหน่งการอ่าน |
---|---|
เอาต์พุต | ดัชนีเอาต์พุตการแมปแผนที่เป็นอาร์เรย์แบบหลายมิติของข้อมูลเอาต์พุตหรือ Buffer ประเภทพื้นฐาน ได้แก่ int, ทศนิยม, ยาว และไบต์ เพียงแต่ต้องเก็บไว้
รายการสำหรับเอาต์พุตที่จะใช้ เมื่อใช้ Buffer ผู้โทรจะต้องตรวจสอบว่า
มีการกำหนดตำแหน่งการเขียนที่เหมาะสม แผนที่อาจว่างเปล่าในกรณีที่
แฮนเดิลบัฟเฟอร์จะใช้สำหรับข้อมูล Tensor เอาต์พุต หรือในกรณีที่มีเอาต์พุตแบบไดนามิก
และผู้โทรจะต้องค้นหารูปร่าง Tensor หลังการอนุมาน
เรียกใช้ โดยดึงข้อมูลจาก tensor เอาต์พุตโดยตรง (ผ่าน Tensor.asReadOnlyBuffer() ) |
การขว้าง
IllegalArgumentException | หาก inputs เป็นค่าว่างหรือว่างเปล่า หาก outputs เป็น
ไม่มีข้อมูล หรือเมื่อเกิดข้อผิดพลาดขณะเรียกใช้การอนุมาน
|
---|