Lớp trình điều khiển để thúc đẩy dự đoán mô hình bằng TensorFlow Lite.
Lưu ý: Nếu bạn không cần truy cập vào bất kỳ tính năng "thử nghiệm" nào Các tính năng API dưới đây, ưu tiên sử dụng Phiên dịch thay vì sử dụng Trình thông dịch trực tiếp.
Interpreter
đóng gói mô hình TensorFlow Lite được huấn luyện trước, trong đó có các hoạt động
được thực thi để suy luận mô hình.
Ví dụ: nếu một mô hình chỉ nhận một dữ liệu đầu vào và chỉ trả về một dữ liệu đầu ra:
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Nếu một mô hình có nhiều dữ liệu đầu vào hoặc đầu ra:
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 (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
}
Nếu một mô hình sử dụng hoặc tạo ra các tensor chuỗi:
String[] input = {"foo", "bar"}; // Input tensor shape is [2].
String[][] output = new String[3][2]; // Output tensor shape is [3, 2].
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(input, output);
}
Lưu ý rằng có sự khác biệt giữa hình dạng [] và hình dạng[1]. Cho tensor chuỗi vô hướng kết quả:
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);
Thứ tự đầu vào và đầu ra được xác định khi chuyển đổi mô hình TensorFlow sang TensorFlowLite với Toco, cũng như hình dạng mặc định của đầu vào.
Khi đầu vào được cung cấp dưới dạng các mảng (đa chiều), (các) tensor đầu vào tương ứng sẽ
được thay đổi kích thước hoàn toàn theo hình dạng của mảng đó. Khi thông tin đầu vào được cung cấp dưới dạng Buffer
không được thực hiện thay đổi kích thước ngầm ẩn; phương thức gọi phải đảm bảo rằng kích thước byte Buffer
khớp với tensor tương ứng hoặc trước tiên sẽ đổi kích thước tensor đó thông qua resizeInput(int, int[])
. Bạn có thể lấy thông tin về loại và hình dạng Tensor qua lớp Tensor
, hoạt động qua getInputTensor(int)
và getOutputTensor(int)
.
CẢNH BÁO: Các thực thể Interpreter
không an toàn cho luồng. Một Interpreter
sở hữu các tài nguyên phải được giải phóng rõ ràng bằng cách gọi close()
Thư viện TFLite được xây dựng dựa trên API NDK 19. Ứng dụng này có thể hoạt động với API Android cấp 19 trở xuống, nhưng không được đảm bảo.
Lớp lồng ghép
lớp | Interpreter.Options | Một lớp tuỳ chọn để kiểm soát hành vi của trình phiên dịch trong thời gian chạy. |
Công ty xây dựng công cộng
Chế độ thông dịch(Tuỳ chọn Mô hình Tệp, Interpreter.Options)
Khởi chạy
Interpreter và chỉ định các tuỳ chọn để tuỳ chỉnh hoạt động của phiên dịch. |
|
Thông dịch viên(ByteBuffer byteBuffer, Interpreter.Options)
Khởi động
Interpreter bằng ByteBuffer của tệp mô hình và một tập hợp gồm
Interpreter.Options tuỳ chỉnh. |
Phương thức công khai
void |
allocateTensors()
Cập nhật rõ ràng các lượt phân bổ cho tất cả tensor, nếu cần.
|
void |
close()
Phát hành các tài nguyên liên kết với thực thể
InterpreterApi . |
int | |
Tensor |
getInputTensor(int inputIndex)
Lấy Tensor liên kết với chỉ mục đầu vào đã cung cấp.
|
int |
getInputTensorCount()
Lấy số lượng tensor đầu vào.
|
Tensor |
getInputTensorFromSignature(String inputName, String signatureKey)
Lấy Tensor liên kết với tên đầu vào và tên phương thức chữ ký đã cung cấp.
|
Long |
getLastNativeInferenceDurationNanoseconds()
Trả về thời gian suy luận gốc.
|
int | |
Tensor |
getOutputTensor(int outputIndex)
Lấy Tensor liên kết với chỉ mục đầu ra được cung cấp.
|
int |
getOutputTensorCount()
Lấy số Tensor đầu ra.
|
Tensor |
getOutputTensorFromSignature(String outputName, String signatureKey)
Lấy Tensor liên kết với tên đầu ra đã cung cấp trong phương thức chữ ký cụ thể.
|
String[] |
getSignatureInputs(String signatureKey)
Lấy danh sách đầu vào SignatureDefs cho phương thức
signatureKey . |
String[] |
getSignatureKeys()
Lấy danh sách tên phương thức đã xuất SignatureDef có trong mô hình.
|
String[] | |
void |
resetVariableTensors()
Nâng cao: Đặt lại tất cả các tensor của biến về giá trị mặc định.
|
void |
resizeInput(int idx, int[] dims, boolean strict)
Đổi kích thước dữ liệu đầu vào thứ idx của mô hình gốc thành các độ tối đã cho.
|
void |
resizeInput(int idx, int[] dims)
Đổi kích thước dữ liệu đầu vào thứ idx của mô hình gốc thành các độ tối đã cho.
|
void | |
void |
runForMultipleInputsOutputs(đầu vào Object[], đầu ra Map<Integer, Object>)
Chạy dự đoán cho mô hình nếu mô hình lấy nhiều đầu vào hoặc trả về nhiều đầu ra.
|
void |
runSignature(Đầu vào Map<String, Object>, Map<Chuỗi, Đối tượng>)
Giống như
runSignature(Map, Map, String) nhưng không yêu cầu truyền signatureKey,
giả sử mô hình có một SignatureDef. |
void | |
void |
setCancelled(boolean đã huỷ)
Nâng cao: Gián đoạn suy luận trong lúc thực hiện lệnh gọi đến
run(Object, Object) . |
Phương thức kế thừa
Công ty xây dựng công cộng
công khai Phiên dịch (Tệp ModelFile)
Khởi chạy một Interpreter
.
Tham số
modelFile | Tệp của mô hình TF Lite được huấn luyện trước. |
---|
Gửi
IllegalArgumentException | nếu modelFile không mã hoá một TensorFlow Lite hợp lệ
mô hình.
|
---|
công khai Phiên dịch (Tệp, mô hình Tệp, Interpreter.Options)
Khởi chạy Interpreter
và chỉ định các tuỳ chọn để tuỳ chỉnh hoạt động của phiên dịch.
Tham số
modelFile | tệp mô hình TF Lite được huấn luyện trước |
---|---|
tùy chọn | một tập hợp các tuỳ chọn để tuỳ chỉnh hành vi của phiên dịch |
Gửi
IllegalArgumentException | nếu modelFile không mã hoá một TensorFlow Lite hợp lệ
mô hình.
|
---|
công khai Phiên dịch (ByteBuffer byteBuffer)
Khởi động Interpreter
bằng ByteBuffer
của tệp mô hình.
Không được sửa đổi ByteBuffer sau khi tạo Interpreter
. Chiến lược phát hành đĩa đơn
ByteBuffer
có thể là MappedByteBuffer
liên kết bộ nhớ với một tệp mô hình, hoặc
trực tiếp ByteBuffer
của nativeOrder() chứa nội dung byte của một mô hình.
Tham số
byteBuffer |
---|
Gửi
IllegalArgumentException | nếu byteBuffer không phải là MappedByteBuffer hoặc không
ByteBuffer trực tiếp của nativeOrder.
|
---|
công khai Phiên dịch (ByteBuffer byteBuffer, tuỳ chọn Interpreter.Options)
Khởi động Interpreter
bằng ByteBuffer
của tệp mô hình và một tập hợp gồm
Interpreter.Options
tuỳ chỉnh.
Bạn không được sửa đổi ByteBuffer
sau khi tạo Interpreter
. ByteBuffer
có thể là MappedByteBuffer
mà liên kết bộ nhớ
một tệp mô hình hoặc ByteBuffer
trực tiếp của nativeOrder() chứa nội dung byte
của một mô hình.
Tham số
byteBuffer | |
---|---|
tùy chọn |
Gửi
IllegalArgumentException | nếu byteBuffer không phải là MappedByteBuffer hoặc không
ByteBuffer trực tiếp của nativeOrder.
|
---|
Phương thức công khai
công khai trống allocateTensors ()
Cập nhật rõ ràng các lượt phân bổ cho tất cả tensor, nếu cần.
Thao tác này sẽ truyền các hình dạng và cơ cấu phân bổ bộ nhớ cho các tensor phụ thuộc bằng cách sử dụng dữ liệu đầu vào hình dạng tensor như đã cho.
Lưu ý: Lệnh gọi này *hoàn toàn không bắt buộc*. Quá trình phân bổ Tensor sẽ tự động diễn ra trong nếu có bất kỳ tensor đầu vào nào được đổi kích thước. Lệnh gọi này hữu ích nhất trong việc xác định cho các tensor đầu ra bất kỳ trước khi thực thi biểu đồ, ví dụ:
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...
Lưu ý: Một số biểu đồ có đầu ra được định dạng động, trong trường hợp đó hình dạng đầu ra có thể không truyền toàn bộ cho đến khi thực thi suy luận.
công khai trống đóng ()
Phát hành các tài nguyên liên kết với thực thể InterpreterApi
.
công khai đánh chặn getInputIndex (Chuỗi opName)
Lấy chỉ mục của một đầu vào dựa vào tên vận hành của đầu vào đó.
Tham số
opName |
---|
công khai Tensor getInputTensor (int inputIndex)
Lấy Tensor liên kết với chỉ mục đầu vào đã cung cấp.
Tham số
inputIndex |
---|
công khai đánh chặn getInputTensorCount ()
Lấy số lượng tensor đầu vào.
công khai Tensor getInputTensorFromSignature (Chuỗi inputName, Chuỗi signatureKey)
Lấy Tensor liên kết với tên đầu vào và tên phương thức chữ ký đã cung cấp.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
Tham số
inputName | Nhập tên trong chữ ký. |
---|---|
signatureKey | Khoá chữ ký xác định SignatureDef, có thể có giá trị rỗng nếu mô hình có một chữ ký. |
Gửi
IllegalArgumentException | nếu inputName hoặc signatureKey là rỗng hoặc trống,
hoặc tên không hợp lệ.
|
---|
công khai đánh chặn getOutputIndex (Chuỗi opName)
Lấy chỉ mục của một đầu ra dựa vào tên hoạt động của đầu ra.
Tham số
opName |
---|
công khai Tensor getOutputTensor (int outputIndex)
Lấy Tensor liên kết với chỉ mục đầu ra được cung cấp.
Lưu ý: Thông tin chi tiết đầu ra tensor (ví dụ: hình dạng) có thể không được điền đầy đủ cho đến sau khi suy luận
sẽ được thực thi. Nếu bạn cần cập nhật thông tin chi tiết *trước khi* chạy suy luận (ví dụ: sau khi đổi kích thước
tensor đầu vào có thể vô hiệu hoá hình dạng tensor đầu ra), sử dụng allocateTensors()
để
kích hoạt phân bổ và truyền hình dạng một cách rõ ràng. Lưu ý rằng, đối với biểu đồ có hình dạng đầu ra
phụ thuộc vào *giá trị* đầu vào, thì hình dạng đầu ra có thể không được xác định hoàn toàn cho đến khi
đang chạy suy luận.
Tham số
outputIndex |
---|
công khai đánh chặn getOutputTensorCount ()
Lấy số Tensor đầu ra.
công khai Tensor getOutputTensorFromSignature (Chuỗi outputName, Chuỗi signatureKey)
Lấy Tensor liên kết với tên đầu ra đã cung cấp trong phương thức chữ ký cụ thể.
Lưu ý: Thông tin chi tiết đầu ra tensor (ví dụ: hình dạng) có thể không được điền đầy đủ cho đến sau khi suy luận
sẽ được thực thi. Nếu bạn cần cập nhật thông tin chi tiết *trước khi* chạy suy luận (ví dụ: sau khi đổi kích thước
tensor đầu vào có thể vô hiệu hoá hình dạng tensor đầu ra), sử dụng allocateTensors()
để
kích hoạt phân bổ và truyền hình dạng một cách rõ ràng. Lưu ý rằng, đối với biểu đồ có hình dạng đầu ra
phụ thuộc vào *giá trị* đầu vào, thì hình dạng đầu ra có thể không được xác định hoàn toàn cho đến khi
đang chạy suy luận.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
Tham số
outputName | Tên đầu ra trong chữ ký. |
---|---|
signatureKey | Khoá chữ ký xác định SignatureDef, có thể có giá trị rỗng nếu mô hình có một chữ ký. |
Gửi
IllegalArgumentException | nếu outputName hoặc signatureKey rỗng hoặc
trống hoặc đã cung cấp tên không hợp lệ.
|
---|
công khai String[] getSignatureInputs (Chuỗi signatureKey)
Lấy danh sách đầu vào SignatureDefs cho phương thức signatureKey
.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
Tham số
signatureKey |
---|
công khai String[] getSignatureKeys ()
Lấy danh sách tên phương thức đã xuất SignatureDef có trong mô hình.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
công khai String[] getSignatureOutputs (Chuỗi signatureKey)
Lấy danh sách kết quả SignatureDefs cho phương thức signatureKey
.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
Tham số
signatureKey |
---|
công khai trống resetVariableTensors ()
Nâng cao: Đặt lại tất cả các tensor của biến về giá trị mặc định.
Nếu một tensor biến không có vùng đệm liên kết, thì tensor này sẽ được đặt lại về 0.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
công khai trống resizeInput (int idx, int[] dims, boolean nghiêm ngặt)
Đổi kích thước dữ liệu đầu vào thứ idx của mô hình gốc thành các độ tối đã cho.
Khi giá trị "strict" là True, thì bạn chỉ có thể đổi kích thước những phương diện chưa xác định. Phương diện không xác định là được biểu thị là "-1" trong mảng do "Tensor.shapeSignature() trả về".
Tham số
quyền kiểm soát xu hướng | |
---|---|
giảm độ sáng | |
nghiêm ngặt |
công khai trống resizeInput (int idx, int[] dims)
Đổi kích thước dữ liệu đầu vào thứ idx của mô hình gốc thành các độ tối đã cho.
Tham số
quyền kiểm soát xu hướng | |
---|---|
giảm độ sáng |
công khai trống chạy (Đầu vào Đối tượng, Đầu ra Đối tượng)
Chạy dự đoán mô hình nếu mô hình chỉ nhận một đầu vào và chỉ cung cấp một đầu ra.
Cảnh báo: API này sẽ hiệu quả hơn nếu là Buffer
(tốt nhất là trực tiếp, nhưng không bắt buộc)
được dùng làm kiểu dữ liệu đầu vào/đầu ra. Hãy cân nhắc sử dụng Buffer
để cấp dữ liệu và tìm nạp
để có hiệu suất tốt hơn. Các loại Buffer
cụ thể sau đây là
được hỗ trợ:
ByteBuffer
– tương thích với mọi kiểu Tensor nguyên thuỷ cơ bản.FloatBuffer
– tương thích với float Tensor.IntBuffer
– tương thích với int32 Tensor.LongBuffer
– tương thích với int64 Tensor.
Buffer
hoặc dưới dạng đầu vào vô hướng.Tham số
input | một mảng hoặc mảng đa chiều hay Buffer thuộc loại nguyên gốc
bao gồm int, float, long và byte. Buffer là cách ưu tiên để truyền tệp lớn
dữ liệu đầu vào cho các loại nguyên hàm, trong khi các loại chuỗi yêu cầu phải sử dụng loại dữ liệu (đa chiều)
đường dẫn đầu vào của mảng. Khi sử dụng Buffer , nội dung của tệp đó phải không thay đổi cho đến
đã suy luận được mô hình và phương thức gọi phải đảm bảo rằng Buffer đang ở
vị trí đọc thích hợp. Chỉ cho phép giá trị null nếu phương thức gọi đang sử dụng
Delegate cho phép khả năng tương tác xử lý vùng đệm và vùng đệm như vậy đã được liên kết với
đầu vào Tensor . |
---|---|
output | một mảng dữ liệu đầu ra đa chiều hoặc một Buffer các kiểu dữ liệu nguyên gốc
bao gồm int, float, long và byte. Khi sử dụng Buffer , phương thức gọi phải đảm bảo
đặt vị trí ghi thích hợp. Giá trị rỗng được cho phép và hữu ích cho
một số trường hợp nhất định, ví dụ: nếu phương thức gọi đang sử dụng Delegate cho phép xử lý vùng đệm
khả năng tương tác và một bộ đệm như vậy đã được liên kết với đầu ra Tensor (xem thêm Interpreter.Options#setAllowBufferHandleOutput(boolean)),
hoặc nếu biểu đồ có các đầu ra được định dạng động và phương thức gọi phải truy vấn hình dạng Tensor đầu ra sau khi suy luận được gọi, thì đang tìm nạp dữ liệu trực tiếp từ đầu ra
tensor (thông qua Tensor.asReadOnlyBuffer() ). |
công khai trống runForMultipleInputsOutputs (Đầu vào Object[], đầu ra Bản đồ<Số nguyên, Đối tượng>)
Chạy dự đoán cho mô hình nếu mô hình lấy nhiều đầu vào hoặc trả về nhiều đầu ra.
Cảnh báo: API này sẽ hiệu quả hơn nếu Buffer
(tốt nhất là trực tiếp, nhưng không bắt buộc)
được dùng làm kiểu dữ liệu đầu vào/đầu ra. Hãy cân nhắc sử dụng Buffer
để cấp dữ liệu và tìm nạp
để có hiệu suất tốt hơn. Các loại Buffer
cụ thể sau đây là
được hỗ trợ:
ByteBuffer
– tương thích với mọi kiểu Tensor nguyên thuỷ cơ bản.FloatBuffer
– tương thích với float Tensor.IntBuffer
– tương thích với int32 Tensor.LongBuffer
– tương thích với int64 Tensor.
Buffer
hoặc dưới dạng đầu vào vô hướng.
Lưu ý: Các giá trị null
cho các phần tử riêng lẻ của inputs
và outputs
là
chỉ được phép nếu phương thức gọi đang sử dụng Delegate
cho phép khả năng xử lý vùng đệm tương tác, và
một bộ đệm như vậy đã được liên kết với Tensor
(các) đầu vào hoặc đầu ra tương ứng.
Tham số
giá trị đầu vào | một mảng dữ liệu đầu vào. Dữ liệu đầu vào phải có cùng thứ tự với dữ liệu đầu vào của
mô hình. Mỗi đầu vào có thể là một mảng hoặc mảng đa chiều hoặc một Buffer của
các kiểu nguyên gốc bao gồm int, float, long và byte. Buffer là cách ưu tiên
để truyền dữ liệu đầu vào lớn, trong khi các loại chuỗi yêu cầu phải dùng mảng (đa chiều)
đường dẫn đầu vào. Khi sử dụng Buffer , nội dung của tệp phải không thay đổi cho đến mô hình
suy luận được thực hiện và phương thức gọi phải đảm bảo rằng Buffer phù hợp
vị trí đọc. |
---|---|
dữ liệu đầu ra | một bản đồ ánh xạ các chỉ mục đầu ra tới các mảng đa chiều của dữ liệu đầu ra hoặc Buffer thuộc loại nguyên gốc bao gồm int, float, long và byte. Ứng dụng chỉ cần giữ lại
mục nhập cho đầu ra sẽ được sử dụng. Khi sử dụng Buffer , phương thức gọi phải đảm bảo
đặt vị trí ghi thích hợp. Bản đồ có thể trống đối với trường hợp
các tay điều khiển bộ đệm được dùng cho dữ liệu tensor đầu ra hoặc các trường hợp đầu ra được tự động
và phương thức gọi phải truy vấn hình dạng Tensor đầu ra sau khi suy luận xong
đã gọi, tìm nạp dữ liệu trực tiếp từ tensor đầu ra (thông qua Tensor.asReadOnlyBuffer() ). |
công khai trống runSignature Dữ liệu đầu vào (Bản đồ<Chuỗi, Đối tượng>, Bản đồ<Chuỗi, Đối tượng>)
Giống như runSignature(Map, Map, String)
nhưng không yêu cầu truyền signatureKey,
giả sử mô hình có một SignatureDef. Nếu mô hình có nhiều SignatureDef thì mô hình sẽ
gửi một trường hợp ngoại lệ.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
Tham số
giá trị đầu vào | |
---|---|
dữ liệu đầu ra |
công khai trống runSignature Dữ liệu đầu vào (Bản đồ<Chuỗi, Đối tượng>, Bản đồ<Chuỗi, Đối tượng>, Chuỗi signatureKey)
Chạy dự đoán mô hình dựa trên SignatureDef được cung cấp thông qua signatureKey
.
Vui lòng xem run(Object, Object)
để biết thêm thông tin về dữ liệu đầu vào và đầu ra được phép
kiểu dữ liệu.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
Tham số
giá trị đầu vào | Một bản đồ từ tên đầu vào trong SignatureDef đến đối tượng đầu vào. |
---|---|
dữ liệu đầu ra | Bản đồ từ tên đầu ra trong SignatureDef đến dữ liệu đầu ra. Trường này có thể trống nếu
phương thức gọi muốn truy vấn dữ liệu Tensor trực tiếp sau khi suy luận (ví dụ: nếu giá trị
hình dạng đầu ra động hoặc tay cầm vùng đệm đầu ra được sử dụng). |
signatureKey | Khoá chữ ký xác định SignatureDef. |
Gửi
IllegalArgumentException | nếu inputs rỗng hoặc trống, nếu outputs hoặc
signatureKey rỗng hoặc nếu có lỗi xảy ra khi chạy suy luận.
|
---|
công khai trống setCancelled (boolean đã bị huỷ)
Nâng cao: Gián đoạn suy luận trong lúc thực hiện lệnh gọi đến run(Object, Object)
.
Một cờ huỷ sẽ được đặt thành true khi hàm này được gọi. Phiên dịch viên sẽ
kiểm tra cờ giữa các lệnh gọi Op và nếu đó là true
, trình thông dịch sẽ dừng
thực thi. Trình phiên dịch sẽ vẫn ở trạng thái đã huỷ cho đến khi thể hiện rõ ràng là "huỷ huỷ" theo
setCancelled(false)
.
CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.
Tham số
đã hủy | true để huỷ suy luận theo cách hiệu quả nhất; false đến
sơ yếu lý lịch. |
---|
Gửi
IllegalStateException | nếu trình thông dịch không được khởi chạy với trình thông dịch có thể huỷ , được tắt theo mặc định. |
---|