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

InterpreterApi

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.
giao diện công cộng InterpreterApi
Các lớp con gián tiếp đã biết

Giao diện với trình thông dịch mô hình TensorFlow Lite, không bao gồm các phương pháp thử nghiệm.

Một cá thể InterpreterApi đóng gói một mô hình TensorFlow Lite được đào tạo trước, trong đó 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 đầu vào và chỉ trả về một đầu ra:

try (InterpreterApi interpreter =
     new InterpreterApi.create(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 (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
 }
 

Nếu một mô hình nhận 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 (InterpreterApi interpreter =
     new InterpreterApi.create(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) tensor đầu vào tương ứng sẽ được thay đổi kích thước ngầm định 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 phiên bản InterpreterApi không an toàn cho chuỗi.

CẢNH BÁO: Một phiên bản InterpreterApi 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 InterpreterApi.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.

Phương thức công khai

khoảng trống trừu tượng
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.
khoảng trống trừu tượng
đóng ()
Giải phóng tài nguyên được liên kết với phiên bản InterpreterApi .
static InterpreterApi
tạo (tùy chọn File modelFile, InterpreterApi.Options )
Tạo một phiên bản InterpreterApi , sử dụng mô hình và các tùy chọn được chỉ định.
static InterpreterApi
tạo (tùy chọn ByteBuffer byteBuffer, InterpreterApi.Options )
Tạo một phiên bản InterpreterApi , sử dụng mô hình và các tùy chọn được chỉ định.
int trừu tượng
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 trừu tượng
getInputTensor (int inputIndex)
Nhận Tensor được liên kết với chỉ mục đầu vào được cung cấp.
int trừu tượng
getInputTensorCount ()
Nhận số lượng tenxơ đầu vào.
trừu tượng dài
getLastNativeInferenceDurationNanoseconds ()
Trả về thời gian suy luận gốc.
int trừu tượng
getOutputIndex ( String opName)
Nhận chỉ mục của một đầu ra với tên op của đầu ra.
Tensor trừu tượng
getOutputTensor (int outputIndex)
Nhận Tensor được liên kết với chỉ số đầu ra được cung cấp.
int trừu tượng
getOutputTensorCount ()
Nhận số Tensors đầu ra.
khoảng trống trừu tượng
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.
khoảng trống trừu tượng
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.
khoảng trống trừu tượng
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.
khoảng trống trừu tượng
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.

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

Phương thức công khai

công khai trừu tượng 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 tensor phụ thuộc bằng cách sử dụng (các) hình dạng tensor đầ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.

Ném
Ngoại lệ nhà nước bất hợp pháp nếu các tensors của đồ thị không thể được phân bổ thành công.

public abstract void close ()

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

public static InterpreterApi tạo (tùy chọn File modelFile, InterpreterApi.Options )

Tạo một phiên bản InterpreterApi , sử dụng mô hình và các tùy chọn được chỉ định. Mô hình sẽ được tải từ một tệp.

Thông số
modelFile Tệp chứ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ệ.

public static InterpreterApi tạo (tùy chọn ByteBuffer byteBuffer, InterpreterApi.Options )

Tạo một phiên bản InterpreterApi , sử dụng mô hình và các tùy chọn được chỉ định. Mô hình sẽ được đọc từ ByteBuffer .

Thông số
byteBuffer Mô hình TF Lite được đào tạo trước, ở dạng tuần tự hóa nhị phân. ByteBuffer không nên được sửa đổi sau khi xây dựng phiên bản InterpreterApi . 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.
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 byteBuffer không phải là MappedByteBuffer cũng không phải là ByteBuffer trực tiếp của nativeOrder.

public abstract 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
Ném
Ngoại lệ Đối số bất hợp pháp nếu opName không khớp với bất kỳ đầu vào nào trong mô hình được sử dụng để khởi tạo trình thông dịch.

công khai trừu tượng 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
Ném
Ngoại lệ Đối số bất hợp pháp nếu inputIndex là số âm hoặc không nhỏ hơn số lượng đầu vào của mô hình.

public abstract int getInputTensorCount ()

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

public abstract Long getLastNativeInferenceDurationNanoseconds ()

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

Ném
Ngoại lệ Đối số bất hợp pháp nếu mô hình không được khởi tạo bởi trình thông dịch.

public abstract 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
Ném
Ngoại lệ Đối số bất hợp pháp nếu opName không khớp với bất kỳ đầu ra nào trong mô hình được sử dụng để khởi tạo trình thông dịch.

công khai trừu tượng 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 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
Ném
Ngoại lệ Đối số bất hợp pháp nếu outputIndex là số âm hoặc không nhỏ hơn số lượng đầu ra của mô hình.

public abstract int getOutputTensorCount ()

Nhận số Tensors đầu ra.

công khai trừu tượng 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ờ
khắt khe
Ném
Ngoại lệ Đối số bất hợp pháp nếu idx là âm hoặc không nhỏ hơn số lượng đầu vào của mô hình; hoặc nếu lỗi xảy ra khi thay đổi kích thước đầu vào idx-th. Ngoài ra, lỗi xảy ra khi cố gắng thay đổi kích thước một tensor với kích thước cố định khi `nghiêm ngặt` là True.

public abstract 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ờ
Ném
Ngoại lệ Đối số bất hợp pháp nếu idx là âm hoặc không nhỏ hơn số lượng đầu vào của mô hình; hoặc nếu lỗi xảy ra khi thay đổi kích thước đầu vào idx-th.

public abstract 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 một Buffer được sử dụng, 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 các trường hợp nhất định, ví dụ: nếu người gọi đang sử dụng Delegate cho phép 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() ).
Ném
Ngoại lệ Đối số bất hợp pháp nếu input là null hoặc rỗng, hoặc nếu lỗi xảy ra khi chạy suy luận.
Ngoại lệ Đối số bất hợp pháp (THỰC NGHIỆM, có thể thay đổi) nếu suy luận bị gián đoạn bởi setCancelled(true) .

public abstract void runForMultipleInputsOutputs (Đầu vào đối tượng [] , đầu ra Bản đồ < Số nguyên , Đối tượng >)

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 ý: giá trị null cho các phần tử không có inputsoutputs 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 (các) đầu vào hoặc đầu ra Tensor 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 một Buffer được sử dụng, 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() ).
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 là null hoặc nếu lỗi xảy ra khi chạy suy luận.