คลาสย่อยโดยอ้อมที่รู้จัก |
อินเทอร์เฟซไปยังอินเทอร์พรีเตอร์ของโมเดล 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 | |
นามธรรม Tensor |
getInputTensor(int InputIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีอินพุตที่ระบุ
|
นามธรรม int |
getInputTensorCount()
ดึงจำนวนของ Tensor อินพุต
|
นามธรรม ยาว |
getLastNativeInferenceDurationNanoseconds()
แสดงเวลาการอนุมานดั้งเดิม
|
นามธรรม int | |
นามธรรม Tensor |
getOutputTensor(intเอาต์พุตIndex)
รับ Tensor ที่เชื่อมโยงกับดัชนีเอาต์พุตที่ระบุ
|
นามธรรม int |
getOutputTensorCount()
รับจำนวนของ Tensor เอาต์พุต
|
นามธรรม โมฆะ |
resizeInput(int idx, int[] dims, boolean strict)
ปรับขนาดอินพุต idx-th ของโมเดลเนทีฟให้เป็นค่าสลัวที่กำหนด
|
นามธรรม โมฆะ |
resizeInput(int idx, int[] หรี่แสง)
ปรับขนาดอินพุต idx-th ของโมเดลเนทีฟให้เป็นค่าสลัวที่กำหนด
|
นามธรรม โมฆะ | |
นามธรรม โมฆะ |
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 TensorIntBuffer
- เข้ากันได้กับ int32 TensorsLongBuffer
- เข้ากันได้กับ 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<Integer, Object> เอาต์พุต)
เรียกใช้การอนุมานโมเดล หากโมเดลใช้อินพุตหลายรายการหรือแสดงผลเอาต์พุตหลายรายการ
คำเตือน: API จะมีประสิทธิภาพมากขึ้นหากใช้ Buffer
(ควรเป็นแบบตรง แต่ไม่บังคับ) เป็นประเภทข้อมูลอินพุต/เอาต์พุต โปรดพิจารณาใช้ Buffer
เพื่อฟีดและดึงข้อมูลพื้นฐานเพื่อประสิทธิภาพที่ดียิ่งขึ้น รองรับประเภท Buffer
ที่เป็นรูปธรรมต่อไปนี้
ByteBuffer
- เข้ากันได้กับ Tensor ประเภทพื้นฐานทั้งหมดFloatBuffer
- เข้ากันได้กับ Float TensorIntBuffer
- เข้ากันได้กับ int32 TensorsLongBuffer
- เข้ากันได้กับ 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 เป็นค่าว่าง หรือหากเกิดข้อผิดพลาดเมื่อเรียกใช้การอนุมาน
|
---|