InterpreterApi

อินเทอร์เฟซสาธารณะ InterpreterApi
คลาสย่อยโดยอ้อมที่รู้จัก

อินเทอร์เฟซไปยังอินเทอร์พรีเตอร์ของโมเดล TensorFlow Lite ยกเว้นเมธอดทดลอง

อินสแตนซ์ InterpreterApi จะสรุปโมเดล TensorFlow Lite ที่ฝึกไว้ล่วงหน้า ซึ่งจะดำเนินการต่างๆ สำหรับการอนุมานโมเดล

เช่น หากโมเดลใช้เพียงอินพุตเดียวและแสดงผลเพียงเอาต์พุตเดียว ให้ทำดังนี้

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 ซึ่งอาจใช้ได้กับ API ของ Android ระดับที่ต่ำกว่า 19 แต่จะไม่รับประกัน

ชั้นเรียนที่ซ้อนกัน

คลาส InterpreterApi.Options คลาสตัวเลือกสำหรับการควบคุมลักษณะการทำงานของอินเตอร์พรีเตอร์รันไทม์

วิธีการสาธารณะ

นามธรรม โมฆะ
allocateTensors()
อัปเดตการจัดสรรสำหรับ Tensor ทั้งหมดอย่างชัดเจน หากจำเป็น
นามธรรม โมฆะ
close()
ปล่อยทรัพยากรที่เชื่อมโยงกับอินสแตนซ์ InterpreterApi
static InterpreterApi
create(ตัวเลือก File modelFile, InterpreterApi.Options)
สร้างอินสแตนซ์ InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ
static InterpreterApi
create(ตัวเลือก ByteBuffer, InterpreterApi.Options)
สร้างอินสแตนซ์ InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ
นามธรรม int
getInputIndex(String opName)
รับดัชนีของอินพุตโดยระบุชื่อตัวเลือกของอินพุต
นามธรรม Tensor
getInputTensor(int InputIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีอินพุตที่ระบุ
นามธรรม int
getInputTensorCount()
ดึงจำนวนของ Tensor อินพุต
นามธรรม ยาว
getLastNativeInferenceDurationNanoseconds()
แสดงเวลาการอนุมานดั้งเดิม
นามธรรม int
getOutputIndex(opName สตริง)
รับดัชนีของเอาต์พุตตามชื่อการดำเนินการของเอาต์พุต
นามธรรม Tensor
getOutputTensor(intเอาต์พุตIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีเอาต์พุตที่ระบุ
นามธรรม int
getOutputTensorCount()
รับจำนวนของ Tensor เอาต์พุต
นามธรรม โมฆะ
resizeInput(int idx, int[] dims, boolean strict)
ปรับขนาดอินพุต idx-th ของโมเดลเนทีฟให้เป็นค่าสลัวที่กำหนด
นามธรรม โมฆะ
resizeInput(int idx, int[] หรี่แสง)
ปรับขนาดอินพุต idx-th ของโมเดลเนทีฟให้เป็นค่าสลัวที่กำหนด
นามธรรม โมฆะ
run(อินพุตออบเจ็กต์ เอาต์พุต ออบเจ็กต์)
เรียกใช้การอนุมานโมเดล หากโมเดลใช้เพียงอินพุตเดียว และให้เอาต์พุตเพียง 1 รายการ
นามธรรม โมฆะ
runForMultipleInputsOutputs(อินพุต Object[], แมป<จำนวนเต็มObject> เอาต์พุต)
เรียกใช้การอนุมานโมเดล หากโมเดลใช้อินพุตหลายรายการหรือแสดงผลเอาต์พุตหลายรายการ

วิธีการที่รับช่วงมา

วิธีการสาธารณะ

สาธารณะ นามธรรม void 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 หากจัดสรร tensors ของกราฟไม่ได้

สาธารณะ นามธรรม โมฆะ ปิด ()

ปล่อยทรัพยากรที่เชื่อมโยงกับอินสแตนซ์ InterpreterApi

สาธารณะ static InterpreterApi สร้าง (ไฟล์ โมเดลไฟล์, InterpreterApi.Options)

สร้างอินสแตนซ์ InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ ระบบจะโหลดโมเดลจากไฟล์

พารามิเตอร์
modelFile ไฟล์ที่มีโมเดล TF Lite ที่ฝึกล่วงหน้า
ตัวเลือก ชุดตัวเลือกสำหรับปรับแต่งลักษณะการทำงานของล่าม
การขว้าง
IllegalArgumentException หาก modelFile ไม่ได้เข้ารหัสโมเดล TensorFlow Lite ที่ถูกต้อง

สาธารณะ สแตติก InterpreterApi สร้าง (ByteBuffer bytesBuffer, ตัวเลือก InterpreterApi.Options)

สร้างอินสแตนซ์ InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ ระบบจะอ่านโมเดลจาก ByteBuffer

พารามิเตอร์
byteBuffer โมเดล TF Lite ที่ฝึกล่วงหน้าในรูปแบบไบนารีแบบอนุกรม ไม่ควรแก้ไข ByteBuffer หลังการสร้างอินสแตนซ์ InterpreterApi ByteBuffer อาจเป็น MappedByteBuffer ที่แมปไฟล์โมเดลในหน่วยความจำ หรือ ByteBuffer โดยตรงของ NativeOrder() ที่มีเนื้อหาไบต์ของโมเดล
ตัวเลือก ชุดตัวเลือกสำหรับปรับแต่งลักษณะการทำงานของล่าม
การขว้าง
IllegalArgumentException หาก byteBuffer ไม่ใช่ MappedByteBuffer หรือ ByteBuffer โดยตรงของ NativeOrder

Public abstract int getInputIndex (String opName)

รับดัชนีของอินพุตโดยระบุชื่อตัวเลือกของอินพุต

พารามิเตอร์
opName
การขว้าง
IllegalArgumentException หาก opName ไม่ตรงกับอินพุตใดๆ ในโมเดลที่ใช้เพื่อเริ่มล่าม

สาธารณะ นามธรรม Tensor getInputTensor (int InputIndex)

รับ Tensor ที่เชื่อมโยงกับดัชนีอินพุตที่ระบุ

พารามิเตอร์
inputIndex
การขว้าง
IllegalArgumentException หาก inputIndex เป็นค่าลบหรือไม่น้อยกว่าจำนวนอินพุตโมเดล

สาธารณะ นามธรรม int getInputTensorCount ()

ดึงจำนวนของ Tensor อินพุต

สาธารณะ นามธรรม ยาว getLastNativeInferenceDurationNanoseconds ()

แสดงเวลาการอนุมานดั้งเดิม

การขว้าง
IllegalArgumentException ในกรณีที่อินเตอร์พรีเตอร์ไม่ได้เริ่มต้นโมเดล

Public abstract int getOutputIndex (String opName)

รับดัชนีของเอาต์พุตตามชื่อการดำเนินการของเอาต์พุต

พารามิเตอร์
opName
การขว้าง
IllegalArgumentException หาก opName ไม่ตรงกับเอาต์พุตใดๆ ในโมเดลที่ใช้เพื่อเริ่มอินเทอร์พรีเตอร์

สาธารณะ นามธรรม Tensor getOutputTensor (int exportIndex)

รับ Tensor ที่เชื่อมโยงกับดัชนีเอาต์พุตที่ระบุ

หมายเหตุ: รายละเอียด Tensor เอาต์พุต (เช่น รูปร่าง) อาจไม่แสดงโดยสมบูรณ์จนกว่าจะทำการอนุมาน หากคุณต้องการอัปเดตรายละเอียด *ก่อน* เรียกใช้การอนุมาน (เช่น หลังจากปรับขนาด Tensor อินพุต ซึ่งอาจทำให้รูปร่าง Tensor เอาต์พุตไม่ถูกต้อง) ให้ใช้ allocateTensors() เพื่อทริกเกอร์การจัดสรรและการเผยแพร่รูปร่างอย่างชัดแจ้ง โปรดทราบว่าสำหรับกราฟที่มีรูปร่างเอาต์พุตที่อาศัย *ค่า* ของอินพุต ระบบอาจกำหนดรูปร่างเอาต์พุตไม่สมบูรณ์จนกว่าจะเรียกใช้การอนุมาน

พารามิเตอร์
outputIndex
การขว้าง
IllegalArgumentException หาก outputIndex เป็นค่าลบหรือไม่น้อยกว่าจำนวนเอาต์พุตโมเดล

Public abstract int getOutputTensorCount ()

รับจำนวนของ Tensor เอาต์พุต

สาธารณะ นามธรรม โมฆะ resizeInput (int idx, int[] dims, boolean strict)

ปรับขนาดอินพุต idx-th ของโมเดลเนทีฟให้เป็นค่าสลัวที่กำหนด

เมื่อ "เข้มงวด" เป็น "จริง" คุณจะปรับขนาดได้เฉพาะขนาดที่ไม่รู้จักเท่านั้น มิติข้อมูลที่ไม่รู้จักจะระบุเป็น "-1" ในอาร์เรย์ที่แสดงผลโดย "Tensor.shapeSignature()"

พารามิเตอร์
idx
dims
เข้มงวด
การขว้าง
IllegalArgumentException หาก idx เป็นค่าลบหรือไม่น้อยกว่าจำนวนอินพุตโมเดล หรือหากเกิดข้อผิดพลาดเมื่อปรับขนาดอินพุต idx-th นอกจากนี้ ข้อผิดพลาดยังเกิดขึ้นเมื่อพยายามปรับขนาด tensor ที่มีขนาดคงที่เมื่อ "strict" เป็น "จริง"

สาธารณะ นามธรรม โมฆะ resizeInput (int idx, int[] dims)

ปรับขนาดอินพุต idx-th ของโมเดลเนทีฟให้เป็นค่าสลัวที่กำหนด

พารามิเตอร์
idx
dims
การขว้าง
IllegalArgumentException หาก idx เป็นค่าลบหรือไม่น้อยกว่าจำนวนอินพุตโมเดล หรือหากเกิดข้อผิดพลาดเมื่อปรับขนาดอินพุต idx-th

สาธารณะ abstract void run (อินพุตออบเจ็กต์, เอาต์พุต Object)

เรียกใช้การอนุมานโมเดล หากโมเดลใช้เพียงอินพุตเดียว และให้เอาต์พุตเพียง 1 รายการ

คำเตือน: API จะมีประสิทธิภาพมากขึ้นหากใช้ Buffer (ควรเป็นแบบตรง แต่ไม่บังคับ) เป็นประเภทข้อมูลอินพุต/เอาต์พุต โปรดพิจารณาใช้ Buffer เพื่อฟีดและดึงข้อมูลพื้นฐานเพื่อประสิทธิภาพที่ดียิ่งขึ้น รองรับประเภท Buffer ที่เป็นรูปธรรมต่อไปนี้

  • ByteBuffer - เข้ากันได้กับ Tensor ประเภทพื้นฐานทั้งหมด
  • FloatBuffer - เข้ากันได้กับ Float Tensor
  • IntBuffer - เข้ากันได้กับ int32 Tensors
  • LongBuffer - เข้ากันได้กับ int64 Tensors
โปรดทราบว่าระบบจะรองรับประเภทบูลีนเป็นอาร์เรย์เท่านั้น ไม่ใช่ Buffer หรืออินพุตแบบสเกลาร์

พารามิเตอร์
อินพุต อาร์เรย์หรืออาร์เรย์หลายมิติ หรือ Buffer ของประเภทดั้งเดิม ซึ่งรวมถึง int, Float, Long และ Byte Buffer เป็นวิธีที่แนะนำในการส่งข้อมูลอินพุตขนาดใหญ่สำหรับประเภทพื้นฐาน ส่วนประเภทสตริงจำเป็นต้องใช้เส้นทางอินพุตอาร์เรย์ (หลายมิติข้อมูล) เมื่อใช้ Buffer เนื้อหาจะไม่มีการเปลี่ยนแปลงจนกว่าจะการอนุมานโมเดลเสร็จสิ้น และผู้โทรจะต้องตรวจสอบว่า Buffer อยู่ในตำแหน่งอ่านที่เหมาะสม ค่า null จะได้รับอนุญาตก็ต่อเมื่อผู้โทรใช้ Delegate ที่อนุญาตให้ทำงานร่วมกันของการจัดการบัฟเฟอร์ และบัฟเฟอร์ดังกล่าวเชื่อมโยงกับอินพุต Tensor
เอาต์พุต อาร์เรย์หลายมิติของข้อมูลเอาต์พุต หรือ Buffer ของประเภทดั้งเดิม ซึ่งรวมถึง int, Float, Long และ Byte เมื่อใช้ Buffer ผู้โทรจะต้องตรวจสอบว่าได้กำหนดตำแหน่งการเขียนที่เหมาะสมแล้ว อนุญาตให้ใช้ค่า Null ได้และมีประโยชน์ในบางกรณี เช่น หากผู้เรียกใช้ใช้ Delegate ที่อนุญาตให้ทำงานร่วมกันของการจัดการบัฟเฟอร์ และบัฟเฟอร์ดังกล่าวมีการเชื่อมโยงกับเอาต์พุต Tensor (ดู Interpreter.Options#setAllowBufferHandleOutput(boolean)) หรือหากกราฟมีเอาต์พุตที่มีรูปร่างแบบไดนามิกและผู้โทรต้องค้นหาเอาต์พุต Tensor เอาต์พุตหลังจากการอนุมานโดยตรง ระบบจะดึงข้อมูลเอาต์พุต Tensor โดยตรง Tensor.asReadOnlyBuffer()
การขว้าง
IllegalArgumentException หาก input เป็นค่าว่างหรือว่างเปล่า หรือหากเกิดข้อผิดพลาดเมื่อเรียกใช้การอนุมาน
IllegalArgumentException (เวอร์ชันทดลอง อาจมีการเปลี่ยนแปลง) หากการอนุมานถูกขัดจังหวะโดย setCancelled(true)

public abstract void runForMultipleInputsOutputs (อินพุต Object[], Map<IntegerObject> เอาต์พุต)

เรียกใช้การอนุมานโมเดล หากโมเดลใช้อินพุตหลายรายการหรือแสดงผลเอาต์พุตหลายรายการ

คำเตือน: API จะมีประสิทธิภาพมากขึ้นหากใช้ Buffer (ควรเป็นแบบตรง แต่ไม่บังคับ) เป็นประเภทข้อมูลอินพุต/เอาต์พุต โปรดพิจารณาใช้ Buffer เพื่อฟีดและดึงข้อมูลพื้นฐานเพื่อประสิทธิภาพที่ดียิ่งขึ้น รองรับประเภท Buffer ที่เป็นรูปธรรมต่อไปนี้

  • ByteBuffer - เข้ากันได้กับ Tensor ประเภทพื้นฐานทั้งหมด
  • FloatBuffer - เข้ากันได้กับ Float Tensor
  • IntBuffer - เข้ากันได้กับ int32 Tensors
  • LongBuffer - เข้ากันได้กับ int64 Tensors
โปรดทราบว่าระบบจะรองรับประเภทบูลีนเป็นอาร์เรย์เท่านั้น ไม่ใช่ Buffer หรืออินพุตแบบสเกลาร์

หมายเหตุ: อนุญาตให้ใช้ค่า null สำหรับองค์ประกอบโดยเจาะจงของ inputs และ outputs ก็ต่อเมื่อผู้เรียกใช้ใช้ Delegate ที่อนุญาตให้ทำงานร่วมกันของการจัดการบัฟเฟอร์ได้ และบัฟเฟอร์ดังกล่าวมีการเชื่อมโยงกับอินพุตหรือเอาต์พุตที่เกี่ยวข้อง Tensor

พารามิเตอร์
อินพุต อาร์เรย์ของข้อมูลอินพุต อินพุตควรอยู่ในลำดับเดียวกับอินพุตของโมเดล อินพุตแต่ละรายการอาจเป็นอาร์เรย์หรืออาร์เรย์หลายมิติ หรือ Buffer ของประเภทดั้งเดิม ซึ่งรวมถึง int, Float, Long และ Byte Buffer เป็นวิธีที่แนะนำในการส่งข้อมูลอินพุตขนาดใหญ่ ในขณะที่ประเภทสตริงจำเป็นต้องใช้เส้นทางอินพุตอาร์เรย์ (หลายมิติข้อมูล) เมื่อใช้ Buffer เนื้อหาจะไม่มีการเปลี่ยนแปลงจนกว่าจะมีการอนุมานโมเดล และผู้โทรจะต้องตรวจสอบว่า Buffer อยู่ในตำแหน่งอ่านที่เหมาะสม
เอาต์พุต ดัชนีเอาต์พุตการแมปแผนที่ไปยังอาร์เรย์หลายมิติของข้อมูลเอาต์พุต หรือ Buffer ของประเภทดั้งเดิม ซึ่งรวมถึง int, Float, Long และ Byte เพียงแต่ต้องเก็บรายการไว้สำหรับเอาต์พุตที่จะนำมาใช้ เมื่อใช้ Buffer ผู้โทรจะต้องตรวจสอบว่าได้กำหนดตำแหน่งการเขียนที่เหมาะสมแล้ว แผนที่อาจว่างเปล่าในกรณีที่ใช้แฮนเดิลบัฟเฟอร์สำหรับข้อมูล Tensor เอาต์พุต หรือกรณีที่เอาต์พุตมีรูปร่างแบบไดนามิกและผู้โทรต้องค้นหารูปร่าง Tensor เอาต์พุตหลังจากเรียกใช้การอนุมานแล้ว โดยดึงข้อมูลจาก Tensor เอาต์พุตโดยตรง (ผ่าน Tensor.asReadOnlyBuffer())
การขว้าง
IllegalArgumentException หาก inputs เป็นค่าว่างหรือว่างเปล่า หาก outputs เป็นค่าว่าง หรือหากเกิดข้อผิดพลาดเมื่อเรียกใช้การอนุมาน