คลาสย่อยทางอ้อมที่รู้จัก |
อินเทอร์เฟซกับล่ามโมเดล 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 | |
นามธรรม เทนเซอร์ | getInputTensor (อินพุทอินพุทอินเด็กซ์) รับค่าเทนเซอร์ที่เกี่ยวข้องกับดัชนีอินพุตที่ให้มา |
นามธรรม int | getInputTensorCount () รับจำนวนเทนเซอร์อินพุต |
นามธรรม ยาว | getLastNativeInferenceDurationนาโนวินาที () ส่งกลับเวลาการอนุมานดั้งเดิม |
นามธรรม int | |
นามธรรม เทนเซอร์ | 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 เป็นโมฆะ หรือหากมีข้อผิดพลาดเกิดขึ้นเมื่อเรียกใช้การอนุมาน |
---|