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);
 }
 

หากแบบจำลองใช้หรือสร้างเทนเซอร์สตริง:

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);
 }
 

ลำดับของอินพุตและเอาต์พุตจะถูกกำหนดเมื่อแปลงโมเดล TensorFlow เป็นโมเดล TensorFlowLite ด้วย Toco เช่นเดียวกับรูปร่างเริ่มต้นของอินพุต

เมื่ออินพุตถูกจัดให้เป็นอาร์เรย์ (หลายมิติ) เทนเซอร์อินพุตที่สอดคล้องกันจะถูกปรับขนาดโดยปริยายตามรูปร่างของอาร์เรย์นั้น เมื่อมีการระบุอินพุตเป็นประเภท Buffer จะไม่มีการปรับขนาดโดยปริยาย ผู้เรียกต้องตรวจสอบให้แน่ใจว่าขนาดไบต์ Buffer ตรงกับเทนเซอร์ที่เกี่ยวข้องหรือว่าก่อนอื่นจะปรับขนาดเทนเซอร์ผ่าน resizeInput(int, int[]) ข้อมูลรูปร่างและประเภทของเทนเซอร์สามารถรับได้ผ่านคลาส Tensor ซึ่งมีให้ผ่านทาง getInputTensor(int) และ getOutputTensor(int)

คำเตือน: อินสแตนซ์ InterpreterApi ไม่ ปลอดภัยสำหรับเธรด

คำเตือน: อินสแตนซ์ของ InterpreterApi เป็นเจ้าของทรัพยากรที่ ต้อง ทำให้ว่างอย่างชัดเจนโดยเรียกใช้ close()

ไลบรารี TFLite สร้างขึ้นโดยเทียบกับ NDK API 19 ซึ่งอาจใช้งานได้กับระดับ Android API ที่ต่ำกว่า 19 แต่ไม่รับประกัน

คลาสที่ซ้อนกัน

ระดับ InterpreterApi.Options คลาสอ็อพชันสำหรับควบคุมพฤติกรรมล่ามรันไทม์

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

นามธรรมเป็นโมฆะ
จัดสรรเทนเซอร์ ()
อัปเดตการจัดสรรสำหรับเทนเซอร์ทั้งหมดโดยชัดแจ้ง หากจำเป็น
นามธรรมเป็นโมฆะ
ปิด ()
เผยแพร่ทรัพยากรที่เกี่ยวข้องกับอินสแตนซ์ InterpreterApi
ล่าม แบบคงที่Api
สร้าง ( ไฟล์ modelFile, ตัวเลือก InterpreterApi.Options )
สร้างอินสแตนซ์ InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ
ล่าม แบบคงที่Api
สร้าง ( ByteBuffer byteBuffer ตัวเลือก InterpreterApi.Options )
สร้างอินสแตนซ์ InterpreterApi โดยใช้โมเดลและตัวเลือกที่ระบุ
นามธรรม int
getInputIndex ( สตริง opName)
รับดัชนีของอินพุตที่กำหนดชื่อ op ของอินพุต
นามธรรม เทนเซอร์
getInputTensor (อินพุทอินพุทอินเด็กซ์)
รับค่าเทนเซอร์ที่เกี่ยวข้องกับดัชนีอินพุตที่ให้มา
นามธรรม int
getInputTensorCount ()
รับจำนวนเทนเซอร์อินพุต
นามธรรม ยาว
getLastNativeInferenceDurationนาโนวินาที ()
ส่งกลับเวลาการอนุมานดั้งเดิม
นามธรรม int
getOutputIndex ( สตริง opName)
รับดัชนีของเอาต์พุตตามชื่อ op ของเอาต์พุต
นามธรรม เทนเซอร์
getOutputTensor (อินท์ outputIndex)
รับค่าเทนเซอร์ที่เกี่ยวข้องกับดัชนีเอาต์พุตที่จัดเตรียมไว้
นามธรรม int
getOutputTensorCount ()
รับจำนวนเทนเซอร์เอาต์พุต
นามธรรมเป็นโมฆะ
resizeInput (int idx, int[] หรี่ลง, บูลีนเข้มงวด)
ปรับขนาดอินพุตที่ idx ของโมเดลดั้งเดิมเป็นค่าหรี่ที่กำหนด
นามธรรมเป็นโมฆะ
resizeInput (int idx, int[] หรี่ลง)
ปรับขนาดอินพุตที่ idx ของโมเดลดั้งเดิมเป็นค่าหรี่ที่กำหนด
นามธรรมเป็นโมฆะ
เรียกใช้ ( วัตถุ อินพุต, เอาต์พุต วัตถุ )
รันการอนุมานโมเดล หากโมเดลรับอินพุตเพียงอินพุตเดียว และระบุเอาต์พุตเพียงเอาต์พุตเดียว
นามธรรมเป็นโมฆะ
runForMultipleInputsOutputs (อินพุต Object [] , แมป < Integer , Object > เอาต์พุต)
รันการอนุมานโมเดล หากโมเดลรับอินพุตหลายอินพุต หรือส่งคืนเอาต์พุตหลายรายการ

วิธีการสืบทอด

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

โมฆะนามธรรมสาธารณะ จัดสรรTensors ()

อัปเดตการจัดสรรสำหรับเทนเซอร์ทั้งหมดโดยชัดแจ้ง หากจำเป็น

สิ่งนี้จะเผยแพร่รูปร่างและการจัดสรรหน่วยความจำสำหรับเทนเซอร์ที่ขึ้นต่อกันโดยใช้รูปร่างเทนเซอร์อินพุตตามที่กำหนด

หมายเหตุ: การโทรนี้เป็น *ไม่บังคับ* การจัดสรรเทนเซอร์จะเกิดขึ้นโดยอัตโนมัติระหว่างการดำเนินการ หากมีการปรับขนาดเทนเซอร์อินพุต การเรียกนี้มีประโยชน์มากที่สุดในการกำหนดรูปร่างสำหรับเทนเซอร์เอาต์พุตก่อนดำเนินการกราฟ เช่น

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 หากไม่สามารถจัดสรรเทนเซอร์ของกราฟได้สำเร็จ

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

เผยแพร่ทรัพยากรที่เกี่ยวข้องกับอินสแตนซ์ InterpreterApi

สร้าง InterpreterApi แบบคงที่สาธารณะ ( ไฟล์ modelFile, ตัวเลือก InterpreterApi.Options )

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

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

InterpreterApi สาธารณะแบบคงที่ สร้าง ( ByteBuffer byteBuffer ตัวเลือก InterpreterApi.Options )

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

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

int นามธรรมสาธารณะ getInputIndex ( สตริง opName)

รับดัชนีของอินพุตที่กำหนดชื่อ op ของอินพุต

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

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

รับค่าเทนเซอร์ที่เกี่ยวข้องกับดัชนีอินพุตที่ให้มา

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

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

รับจำนวนเทนเซอร์อินพุต

บทคัดย่อสาธารณะ Long getLastNativeInferenceDurationNanoseconds ()

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

ขว้าง
IllegalArgumentException หากตัวแปลไม่ได้เริ่มต้นโดยล่าม

int นามธรรมสาธารณะ getOutputIndex ( สตริง opName)

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

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

บทคัดย่อสาธารณะ Tensor getOutputTensor (int outputIndex)

รับค่าเทนเซอร์ที่เกี่ยวข้องกับดัชนีเอาต์พุตที่จัดเตรียมไว้

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

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

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

รับจำนวนเทนเซอร์เอาต์พุต

โมฆะนามธรรมสาธารณะ resizeInput (int idx, int[] หรี่ลง, บูลีนเข้มงวด)

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

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

พารามิเตอร์
idx
ติ่มซำ
เข้มงวด
ขว้าง
IllegalArgumentException ถ้า idx เป็นค่าลบหรือน้อยกว่าจำนวนอินพุตของโมเดล หรือหากเกิดข้อผิดพลาดขณะปรับขนาดอินพุต idx นอกจากนี้ ข้อผิดพลาดยังเกิดขึ้นเมื่อพยายามปรับขนาดเทนเซอร์ด้วยมิติคงที่เมื่อ "เข้มงวด" เป็นจริง

โมฆะนามธรรมสาธารณะ resizeInput (int idx, int[] หรี่ลง)

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

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

การ รัน โมฆะนามธรรมสาธารณะ (อินพุต อ็อบเจ็กต์ , เอาต์พุต อ็อบเจ็กต์ )

รันการอนุมานโมเดล หากโมเดลรับอินพุตเพียงอินพุตเดียว และระบุเอาต์พุตเพียงเอาต์พุตเดียว

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

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

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

โมฆะนามธรรมสาธารณะ runForMultipleInputsOutputs (อินพุต วัตถุ [] , แผนที่ < จำนวนเต็ม , วัตถุ > เอาต์พุต)

รันการอนุมานโมเดล หากโมเดลรับอินพุตหลายอินพุต หรือส่งคืนเอาต์พุตหลายรายการ

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

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

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

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