Tham dự Hội nghị chuyên đề Women in ML vào ngày 7 tháng 12 Đăng ký ngay

Interpreter

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Thông dịch viên lớp cuối cùng

Lớp trình điều khiển để lái xe suy luận mô hình với TensorFlow Lite.

Lưu ý: Nếu bạn không cần quyền truy cập vào bất kỳ tính năng API "thử nghiệm" nào bên dưới, hãy thích sử dụng InterpreterApi và InterpreterFactory hơn là sử dụng trực tiếp Trình thông dịch.

Interpreter đóng gói mô hình TensorFlow Lite được đào tạo trước, trong đó các hoạt động được thực hiện để suy luận mô hình.

Ví dụ: nếu một mô hình chỉ nhận một đầu vào và chỉ trả về một đầ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 đầ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 lấy hoặc tạo chuỗi căng:

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

Thứ tự của đầu vào và đầu ra được xác định khi chuyển đổi mô hình TensorFlow sang mô hình TensorFlowLite với Toco, cũng như hình dạng mặc định của các đầu vào.

Khi các đầu vào được cung cấp dưới dạng mảng (nhiều chiều), (các) tenxơ đầu vào tương ứng sẽ được thay đổi kích thước ngầm theo hình dạng của mảng đó. Khi các đầu vào được cung cấp dưới dạng các loại Buffer , không có việc thay đổi kích thước ngầm nào được thực hiện; người gọi phải đảm bảo rằng kích thước byte Buffer khớp với kích thước của tensor tương ứng hoặc trước tiên họ thay đổi kích thước của tensor thông qua resizeInput(int, int[]) . Thông tin về kiểu và hình dạng của Tensor có thể được lấy thông qua lớp Tensor , có sẵn thông qua getInputTensor(int)getOutputTensor(int) .

CẢNH BÁO: Các Interpreter bản thông dịch viên không an toàn theo chuỗi. 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 hàm close()

Thư viện TFLite được xây dựng dựa trên NDK API 19. Nó có thể hoạt động cho các cấp API Android dưới 19, nhưng không được đảm bảo.

Lớp học lồng nhau

lớp Interpreter.Options Một lớp tùy chọn để kiểm soát hành vi của trình thông dịch thời gian chạy.

Người xây dựng công cộng

Thông dịch viên ( File modelFile)
Khởi tạo Interpreter .
Thông dịch viên (tùy chọn File modelFile, Interpreter.Options )
Khởi tạo Interpreter và chỉ định các tùy chọn để tùy chỉnh hành vi của trình thông dịch.
Thông dịch viên ( ByteBuffer byteBuffer)
Khởi tạo Interpreter với Bộ ByteBuffer của tệp mô hình.
Thông dịch viên (tùy chọn ByteBuffer byteBuffer, Interpreter.Options )
Khởi tạo Interpreter với Bộ ByteBuffer của tệp mô hình và một tập hợp Trình thông dịch tùy Interpreter.Options .

Phương thức công khai

vô hiệu
phân bổ ()
Cập nhật rõ ràng các phân bổ cho tất cả các tensor, nếu cần.
vô hiệu
đóng ()
Giải phóng tài nguyên được liên kết với phiên bản InterpreterApi .
int
getInputIndex ( String opName)
Nhận chỉ mục của một đầu vào với tên op của đầu vào.
Tensor
getInputTensor (int inputIndex)
Nhận Tensor được liên kết với chỉ mục đầu vào được cung cấp.
int
getInputTensorCount ()
Nhận số lượng tenxơ đầu vào.
Tensor
getInputTensorFromSignature ( String inputName, String signatureKey)
Nhận Tensor được liên kết với tên đầu vào được cung cấp và tên phương thức chữ ký.
Dài
getLastNativeInferenceDurationNanoseconds ()
Trả về thời gian suy luận gốc.
int
getOutputIndex ( Chuỗi opName)
Nhận chỉ mục của một đầu ra với tên op của đầu ra.
Tensor
getOutputTensor (int outputIndex)
Nhận Tensor được liên kết với chỉ số đầu ra được cung cấp.
int
getOutputTensorCount ()
Nhận số Tensors đầu ra.
Tensor
getOutputTensorFromSignature ( String outputName, String signatureKey)
Nhận Tensor được liên kết với tên đầu ra được cung cấp trong phương pháp chữ ký cụ thể.
Sợi dây[]
getSignatureInputs ( String signatureKey)
Nhận danh sách các đầu vào SignatureDefs cho phương thức signatureKey .
Sợi dây[]
getSignatureKeys ()
Nhận danh sách các tên phương thức đã xuất SignatureDef có sẵn trong mô hình.
Sợi dây[]
getSignatureOutputs ( String signatureKey)
Nhận danh sách đầu ra SignatureDefs cho phương thức signatureKey .
vô hiệu
resetVariableTensors ()
Nâng cao: Đặt lại tất cả các tenxơ biến đổi thành giá trị mặc định.
vô hiệu
resizeInput (int idx, int [] dims, boolean nghiêm ngặt)
Thay đổi kích thước đầu vào idx-thứ của mô hình gốc thành các khoảng mờ nhất định.
vô hiệu
resizeInput (int idx, int [] dims)
Thay đổi kích thước đầu vào idx-thứ của mô hình gốc thành các khoảng mờ nhất định.
vô hiệu
run (Đầu vào đối tượng , Đầu ra đối tượng )
Chạy suy luậ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.
vô hiệu
runForMultipleInputsOutputs (Đầu vào Đối tượng [] , Bản đồ < Số nguyên , Đối tượng > đầu ra)
Chạy suy luận mô hình nếu mô hình nhận nhiều đầu vào hoặc trả về nhiều đầu ra.
vô hiệu
runSignature ( Bản đồ < Chuỗi , Đối tượng > đầu vào, Bản đồ < Chuỗi , Đối tượng > đầu ra)
Tương tự như runSignature(Map, Map, String) nhưng không yêu cầu truyền một SignatureKey, giả sử mô hình có một SignatureDef.
vô hiệu
runSignature ( Map < String , Object > input, Map < String , Object > output, String signatureKey)
Chạy suy luận mô hình dựa trên SignatureDef được cung cấp thông qua signatureKey .
vô hiệu
setCancelt (boolean bị hủy)
Nâng cao: Ngắt suy luận ở giữa cuộc gọi để run(Object, Object) .

Phương thức kế thừa

Người xây dựng công cộng

thông dịch viên công cộng ( File modelFile)

Khởi tạo Interpreter .

Thông số
modelFile một Tệp của mô hình TF Lite được đào tạo trước.
Ném
Ngoại lệ Đối số bất hợp pháp nếu modelFile không mã hóa mô hình TensorFlow Lite hợp lệ.

thông dịch viên công cộng (tùy chọn File modelFile, Interpreter.Options )

Khởi tạo Interpreter và chỉ định các tùy chọn để tùy chỉnh hành vi của trình thông dịch.

Thông số
modelFile một tệp của mô hình TF Lite được đào tạo trước
tùy chọn một tập hợp các tùy chọn để tùy chỉnh hành vi thông dịch viên
Ném
Ngoại lệ Đối số bất hợp pháp nếu modelFile không mã hóa mô hình TensorFlow Lite hợp lệ.

thông dịch viên công cộng ( ByteBuffer byteBuffer)

Khởi tạo Interpreter với Bộ ByteBuffer của tệp mô hình.

Bộ đệm Byte không nên được sửa đổi sau khi xây dựng Interpreter . ByteBuffer có thể là MappedByteBuffer mà bộ nhớ ánh xạ 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.

Thông số
byteBuffer
Ném
Ngoại lệ Đối số bất hợp pháp nếu byteBuffer không phải là MappedByteBuffer cũng không phải là ByteBuffer trực tiếp của nativeOrder.

thông dịch viên công cộng (tùy chọn ByteBuffer byteBuffer, Interpreter.Options )

Khởi tạo Interpreter với Bộ ByteBuffer của tệp mô hình và một tập hợp Trình thông dịch tùy Interpreter.Options .

Bộ ByteBuffer không nên được sửa đổi sau khi xây dựng Interpreter . ByteBuffer có thể là MappedByteBuffer mà bộ nhớ ánh xạ 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.

Thông số
byteBuffer
tùy chọn
Ném
Ngoại lệ Đối số bất hợp pháp nếu byteBuffer không phải là MappedByteBuffer cũng không phải là ByteBuffer trực tiếp của nativeOrder.

Phương thức công khai

công khai void phân bổTensors ()

Cập nhật rõ ràng các phân bổ cho tất cả các tensor, nếu cần.

Điều này sẽ truyền các hình dạng và phân bổ bộ nhớ cho các tenxơ phụ thuộc bằng cách sử dụng (các) hình dạng tenxơ đầu vào như đã cho.

Lưu ý: Cuộc gọi này * hoàn toàn là tùy chọn *. Việc phân bổ độ căng sẽ tự động xảy ra trong quá trình thực thi nếu bất kỳ bộ căng đầu vào nào đã được thay đổi kích thước. Lệnh gọi này hữu ích nhất trong việc xác định hình dạng cho bất kỳ bộ căng đầu ra nào trước khi thực hiện 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ố đồ thị có đầu ra được định hình động, trong trường hợp đó, hình dạng đầu ra có thể không truyền hoàn toàn cho đến khi thực hiện suy luận.

public void close ()

Giải phóng tài nguyên được liên kết với phiên bản InterpreterApi .

public int getInputIndex ( String opName)

Nhận chỉ mục của một đầu vào với tên op của đầu vào.

Thông số
opName

public Tensor getInputTensor (int inputIndex)

Nhận Tensor được liên kết với chỉ mục đầu vào được cung cấp.

Thông số
inputIndex

public int getInputTensorCount ()

Nhận số lượng tenxơ đầu vào.

public Tensor getInputTensorFromSignature ( String inputName, String signatureKey)

Nhận Tensor được liên kết với tên đầu vào được cung cấp và tên phương thức chữ ký.

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

Thông số
inputName Nhập tên trong chữ ký.
chữ ký Khóa chữ ký xác định SignatureDef, có thể là rỗng nếu mô hình có một chữ ký.
Ném
Ngoại lệ Đối số bất hợp pháp nếu inputName hoặc signatureKey là null hoặc trống hoặc được cung cấp tên không hợp lệ.

public Long getLastNativeInferenceDurationNanoseconds ()

Trả về thời gian suy luận gốc.

public int getOutputIndex ( String opName)

Nhận chỉ mục của một đầu ra với tên op của đầu ra.

Thông số
opName

public Tensor getOutputTensor (int outputIndex)

Nhận Tensor được liên kết với chỉ số đầu ra được cung cấp.

Lưu ý: Các chi tiết về tensor đầu ra (ví dụ: hình dạng) có thể không được điền đầy đủ cho đến khi thực hiện suy luận. 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 thay đổi kích thước của tensor đầu vào, điều này có thể làm mất hiệu lực của các hình dạng tensor đầu ra), hãy 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 đồ thị có hình dạng đầu ra phụ thuộc vào giá trị * đầu vào *, hình dạng đầu ra có thể không được xác định đầy đủ cho đến khi chạy suy luận.

Thông số
outputIndex

public int getOutputTensorCount ()

Nhận số Tensors đầu ra.

public Tensor getOutputTensorFromSignature ( String outputName, String signatureKey)

Nhận Tensor được liên kết với tên đầu ra được cung cấp trong phương pháp chữ ký cụ thể.

Lưu ý: Các chi tiết về tensor đầu ra (ví dụ: hình dạng) có thể không được điền đầy đủ cho đến khi thực hiện suy luận. 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 thay đổi kích thước của tensor đầu vào, điều này có thể làm mất hiệu lực của các hình dạng tensor đầu ra), hãy 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 đồ thị có hình dạng đầu ra phụ thuộc vào giá trị * đầu vào *, hình dạng đầu ra có thể không được xác định đầy đủ cho đến khi chạy suy luận.

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

Thông số
outputName Tên đầu ra trong chữ ký.
chữ ký Khóa chữ ký xác định SignatureDef, có thể là rỗng nếu mô hình có một chữ ký.
Ném
Ngoại lệ Đối số bất hợp pháp nếu outputName hoặc signatureKey là null hoặc rỗng, hoặc tên được cung cấp không hợp lệ.

public String [] getSignatureInputs ( String signatureKey)

Nhận danh sách các đầu vào SignatureDefs cho phương thức signatureKey .

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

Thông số
chữ ký

public String [] getSignatureKeys ()

Nhận danh sách các tên phương thức đã xuất SignatureDef có sẵn trong mô hình.

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

public String [] getSignatureOutputs ( String signatureKey)

Nhận danh sách đầu ra SignatureDefs cho phương thức signatureKey .

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

Thông số
chữ ký

public void resetVariableTensors ()

Nâng cao: Đặt lại tất cả các tenxơ biến đổi thành giá trị mặc định.

Nếu một tensor biến không có bộ đệm liên quan, nó sẽ được đặt lại về 0.

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

public void resizeInput (int idx, int [] dims, boolean nghiêm ngặt)

Thay đổi kích thước đầu vào idx-thứ của mô hình gốc thành các khoảng mờ nhất định.

Khi `nghiêm ngặt` là True, chỉ những thứ nguyên không xác định mới có thể được thay đổi kích thước. Kích thước không xác định được chỉ định là `-1` trong mảng được trả về bởi` Tensor.shapeSignature () `.

Thông số
idx
mờ
nghiêm khắc

public void resizeInput (int idx, int [] dims)

Thay đổi kích thước đầu vào idx-thứ của mô hình gốc thành các khoảng mờ nhất định.

Thông số
idx
mờ

public void run (Đầu vào đối tượng , Đầu ra đối tượng )

Chạy suy luậ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 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 sử dụng làm kiểu dữ liệu đầu vào / đầu ra. Vui lòng xem xét sử dụng Buffer để cung cấp và tìm nạp dữ liệu ban đầu để có hiệu suất tốt hơn. Các loại Buffer bê tông sau được hỗ trợ:

  • ByteBuffer - tương thích với bất kỳ loại Tensor nguyên thủy nào.
  • FloatBuffer - tương thích với float Tensors.
  • IntBuffer - tương thích với int32 Tensors.
  • LongBuffer - tương thích với int64 Tensors.
Lưu ý rằng các kiểu boolean chỉ được hỗ trợ dưới dạng mảng, không phải Buffer hoặc dưới dạng đầu vào vô hướng.

Thông số
đầu vào một mảng hoặc mảng nhiều chiều, hoặc Buffer của các kiểu nguyên thủy bao gồm int, float, long và byte. Buffer là cách ưa thích để truyền dữ liệu đầu vào lớn cho các kiểu nguyên thủy, trong khi kiểu chuỗi yêu cầu sử dụng đường dẫn đầu vào mảng (đa chiều). Khi một Buffer được sử dụng, nội dung của nó sẽ không thay đổi cho đến khi thực hiện xong suy luận mô hình và người gọi phải đảm bảo rằng Buffer ở vị trí đọc thích hợp. Giá trị null chỉ được phép nếu người gọi đang sử dụng Delegate cho phép tương tác xử lý bộ đệm và bộ đệm như vậy đã được liên kết với Tensor đầu vào.
đầu ra một mảng dữ liệu đầu ra đa chiều hoặc một Buffer của các kiểu nguyên thủy bao gồm int, float, long và byte. Khi sử dụng Buffer , người gọi phải đảm bảo rằng nó được đặt vị trí ghi thích hợp. Giá trị null được cho phép và hữu ích cho một số trường hợp nhất định, ví dụ: nếu người gọi đang sử dụng Delegate cho phép tương tác xử lý bộ đệm và 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 đồ thị có đầu ra được định hình động và người gọi phải truy vấn hình dạng Tensor đầu ra sau khi suy luận đã được gọi, tìm nạp dữ liệu trực tiếp từ tensor đầu ra (thông qua Tensor.asReadOnlyBuffer() ).

public void runForMultipleInputsOutputs ( Object [] đầu vào, Map < Integer , Object > đầu ra)

Chạy suy luận mô hình nếu mô hình nhận nhiều đầu vào hoặc trả về nhiều đầu ra.

Cảnh báo: API 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 sử dụng làm kiểu dữ liệu đầu vào / đầu ra. Vui lòng xem xét sử dụng Buffer để cung cấp và tìm nạp dữ liệu ban đầu để có hiệu suất tốt hơn. Các loại Buffer bê tông sau được hỗ trợ:

  • ByteBuffer - tương thích với bất kỳ loại Tensor nguyên thủy nào.
  • FloatBuffer - tương thích với float Tensors.
  • IntBuffer - tương thích với int32 Tensors.
  • LongBuffer - tương thích với int64 Tensors.
Lưu ý rằng các kiểu boolean chỉ được hỗ trợ dưới dạng mảng, không phải Buffer hoặc dưới dạng đầu vào vô hướng.

Lưu ý: chỉ cho phép các giá trị null cho các phần tử không có inputsoutputs nếu người gọi đang sử dụng Delegate cho phép tương tác xử lý bộ đệm và bộ đệm như vậy đã được liên kết với (các) Tensor đầu vào hoặc đầu ra tương ứng.

Thông số
đầu vào một mảng dữ liệu đầu vào. Các đầu vào phải cùng thứ tự với các đầ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 Buffer của các kiểu nguyên thủy bao gồm int, float, long và byte. Buffer là cách ưa thích để truyền dữ liệu đầu vào lớn, trong khi các kiểu chuỗi yêu cầu sử dụng đường dẫn đầu vào mảng (đa chiều). Khi Buffer được sử dụng, nội dung của nó sẽ không thay đổi cho đến khi thực hiện xong suy luận mô hình và người gọi phải đảm bảo rằng Buffer ở vị trí đọc thích hợp.
đầu ra ánh xạ bản đồ các chỉ số đầu ra tới các mảng đa chiều của dữ liệu đầu ra hoặc Buffer của các kiểu nguyên thủy bao gồm int, float, long và byte. Nó chỉ cần giữ các mục nhập cho các kết quả đầu ra được sử dụng. Khi sử dụng Buffer , người gọi phải đảm bảo rằng nó được đặt vị trí ghi thích hợp. Bản đồ có thể trống đối với các trường hợp trong đó các chốt điều khiển bộ đệm được sử dụng cho dữ liệu tensor đầu ra hoặc các trường hợp đầu ra được định hình động và người gọi phải truy vấn hình dạng Tensor đầu ra sau khi suy luận đã được gọi, tìm nạp dữ liệu trực tiếp từ tensor đầu ra ( thông qua Tensor.asReadOnlyBuffer() ).

public void runSignature ( Map < String , Object > input, Map < String , Object > output)

Tương tự như runSignature(Map, Map, String) nhưng không yêu cầu truyền một SignatureKey, giả sử mô hình có một SignatureDef. Nếu mô hình có nhiều hơn một SignatureDef, nó sẽ đưa ra một ngoại lệ.

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

Thông số
đầu vào
đầu ra

public void runSignature ( Map < String , Object > input, Map < String , Object > output, String signatureKey)

Chạy suy luận mô hình dựa trên SignatureDef được cung cấp thông qua signatureKey .

Xem run(Object, Object) để biết thêm chi tiết về các kiểu dữ liệu đầu vào và đầu ra được phép.

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

Thông số
đầu vào Một ánh xạ từ tên đầu vào trong SignatureDef đến một đối tượng đầu vào.
đầu ra Một bản đồ từ tên đầu ra trong SignatureDef đến dữ liệu đầu ra. Điều này có thể trống nếu người gọi muốn truy vấn dữ liệu Tensor trực tiếp sau khi suy luận (ví dụ: nếu hình dạng đầu ra là động, hoặc các xử lý bộ đệm đầu ra được sử dụng).
chữ ký Khóa chữ ký xác định SignatureDef.
Ném
Ngoại lệ Đối số bất hợp pháp nếu inputs là null hoặc trống, nếu outputs hoặc signatureKey là rỗng, hoặc nếu lỗi xảy ra khi chạy suy luận.

public void setCancelt (boolean bị hủy)

Nâng cao: Ngắt suy luận ở giữa cuộc gọi để run(Object, Object) .

Cờ hủy sẽ được đặt thành true khi hàm này được gọi. Trình thông dịch sẽ kiểm tra cờ giữa các lệnh gọi Op và nếu nó true , trình thông dịch sẽ ngừng thực thi. Trình thông dịch sẽ vẫn ở trạng thái bị hủy cho đến khi được setCancelled(false) "hủy bỏ" một cách rõ ràng.

CẢNH BÁO: Đây là một API thử nghiệm và có thể thay đổi.

Thông số
bị hủy bỏ true để hủy bỏ suy luận theo cách cố gắng nhất; false để tiếp tục.
Ném
Ngoại lệ nhà nước bất hợp pháp nếu trình thông dịch không được khởi tạo bằng tùy chọn có thể hủy, tùy chọn này được tắt theo mặc định.