View Source Changelog

v0.4.0-rc1 (2026-08-19)

Browse the Repository | Released Assets

A release candidate. Everything here is new surface rather than changed behaviour, but it is a lot of it at once, so it is worth a look before it becomes 0.4.0. Depend on it explicitly -- a pre-release is not picked up by a requirement like "~> 0.3".

Added

  • Signature runners. A model's signatures could be listed with interpreter:signature_keys/1 and get_signature_defs/1, but there was no way to run one, so tensors still had to be addressed by index and the order of a model's outputs guessed at. tflite_beam_interpreter:get_signature_runner/2 now returns a runner, and tflite_beam_signature_runner drives it: names and counts of its inputs and outputs, reading and writing them by name, resizing them, allocating, invoking and cancelling.

    Passing nil as the key asks for the primary subgraph, which works on models that declare no signatures at all, so this is usable with older exports too.

    A runner belongs to the interpreter that handed it out and holds a reference to it, so it stays usable even after the interpreter's own term is collected. Like the interpreter it is not safe to use from several processes at once.

  • tflite_beam_interpreter:enable_cancellation/1 and cancel/1. An invocation runs on a dirty scheduler and could not be interrupted; cancel/1 does not block and is safe to call from another process, so a long inference can now be given up on. Without enable_cancellation/1 beforehand, cancelling is an error.

  • tflite_beam_interpreter:release_non_persistent_memory/1, which hands back the memory that is only needed while invoking. Invoking again reallocates it, trading time for memory on devices short of the latter.

  • tflite_beam_interpreter:reset_variable_tensors/1, resetting all of a model's variable tensors. Only a single-tensor version existed.

  • tflite_beam_interpreter:get_allow_fp16_precision_for_fp32/1 and set_allow_fp16_precision_for_fp32/2.

  • tflite_beam_interpreter:signature_inputs/2, signature_outputs/2, get_subgraph_index_from_signature/2 and subgraphs_size/1, which describe a model's signatures and subgraphs without having to build a runner.

  • tflite_beam_interpreter:resize_input_tensor/3 and resize_input_tensor_strict/3. Input shapes could not be changed at all before, so a model with a variable dimension could only ever be fed whatever shape it was exported with. Call allocate_tensors/1 again afterwards. The strict variant only touches dimensions the model left unknown.

  • tflite_beam_flatbuffer_model:verify_and_build_from_buffer/1,2. A verifying counterpart existed for files but not for buffers, so a model already in memory could only be built unchecked.

Fixed

  • The minimum_runtime field of the tflite_beam_flatbuffer_model record held a boolean. Three of the four places that fill the record asked flatbuffer_model_initialized for it, so anyone reading the field to decide whether a runtime is new enough was reading true.
  • Building a model from a buffer no longer leaks the copy of that buffer when the model turns out not to parse.

v0.3.12 (2026-08-19)

Browse the Repository | Released Assets

Fixed

  • Interpreters, interpreter builders and the resources they borrow (the op resolver and the flatbuffer model) now hold real references to each other. Previously only a hand-rolled counter recorded the link, so the VM was free to collect a resource that was still in use, and the destructor's decrement landed in whatever resource had been given that memory next. On arm64 this brought down the emulator with SIGBUS.
  • Resources are no longer read uninitialised. enif_alloc_resource hands back raw memory, so fields that looked initialised in the struct definition were not, and NifResTfLiteTensor could reach delete on a wild pointer.
  • Every tflite::FlatBufferModel and every tflite::Interpreter was leaked; both are now released with the resource that owns them.
  • Creating an Edge TPU interpreter no longer leaks its resource when the interpreter cannot be built or its tensors cannot be allocated.
  • Tensor resources are no longer leaked. Each one was created with a reference that nobody ever gave back, on top of the one the interpreter's cache holds, so none of them could be freed. Failing partway through reading a tensor leaked one as well.
  • Edge TPU context resources are no longer leaked, for the same reason: the reference from enif_alloc_resource was never released.
  • allocate_tensors no longer reports unknown error for three of the statuses TFLite can return. A model carrying ops the interpreter cannot resolve -- an Edge TPU model given to a plain builtin resolver, say -- now says UnresolvedOps instead. The mapping lived in two places, one of which had drifted; there is now only one.
  • The Edge TPU itself is handed back when nothing is using it any more. Contexts were parked in a global map that was written to and never read, purely so their shared_ptr could not run out, which held the device until the VM exited. Each context resource now owns its share directly, and an Edge TPU interpreter holds a reference to the context it delegates to, so the device outlives every interpreter built on it and is released once the last one is gone.

v0.3.11 (2026-08-15)

Browse the Repository | Released Assets

Fixed

  • Platform-specific binaries now go to the consuming app's _build/<target>_<env>/lib/tflite_beam/priv instead of deps/tflite_beam/priv, so switching MIX_TARGET no longer picks up another target's tflite_beam.so. rm -rf deps/tflite_beam is no longer needed when cross-compiling (#73).
  • Building from source no longer fails on hosts that have gflags installed system-wide (e.g. brew install gflags). glog resolved gflags through find_package, which picked up the system copy and collided with the targets the bundled gflags had already defined.

v0.3.10 (2026-06-30)

Browse the Repository | Released Assets

Changed

  • [deps] Use libedgetpu v0.1.14.
  • Use tensorflow v2.21.0.

v0.3.9 (2025-04-03)

Browse the Repository | Released Assets

Changed

  • [deps] Use libedgetpu v0.1.12.
  • Use tensorflow v2.19.0.

v0.3.8 (2025-02-10)

Browse the Repository | Released Assets

Changed

  • [deps] Use libedgetpu v0.1.10.
  • Use tensorflow v2.18.0.

v0.3.7 (2024-09-03)

Browse the Repository | Released Assets

Fixed

  • fixed project build directory

v0.3.6 (2024-03-17)

Browse the Repository | Released Assets

Changed

  • [deps] Use libedgetpu v0.1.9.
  • Use tensorflow v2.16.1.
  • Use libusb v1.0.27.
  • Use Erlang/OTP 25.x for precompiled binaries. This unified the required Erlang/OTP NIF version to 2.16 for precompiled binaries.
  • Detect and use HTTP_PROXY, HTTPS_PROXY, http_proxy and https_proxy when fetch preocmpiled binary from GitHub.

v0.3.5 (2024-01-24)

Browse the Repository | Released Assets

Changed

  • Precompiled version for armv6 devices.
  • Removed TFBEAM_XNNPACK_ENABLE_ARM_I8MM option as it should work as long as a newer C compiler is used.
  • Updated metadata_schema to 1.5.0

v0.3.4 (2024-01-23)

Browse the Repository | Released Assets

Changed

  • [deps] Use libedgetpu v0.1.8.
  • Use tensorflow v2.15.0.

v0.3.3 (2023-07-21)

Browse the Repository | Released Assets

Changed

  • [deps] Use libedgetpu v0.1.7.
  • Use tensorflow v2.13.0.

v0.3.2 (2023-04-03)

Browse the Repository | Released Assets

Fixed

  • [precompiled-nerves] Guess correct TARGET_ARCH from TARGET_CPU.

v0.3.1 (2023-04-03)

Browse the Repository | Released Assets

Fixed

  • [deps] Use libedgetpu v0.1.6.

Changed

v0.3.0 (2023-04-02)

Browse the Repository | Released Assets

Breaking Change

  • This repo will now be the TensorFlow Lite Erlang bindings. For Elixir bindings, please visit cocoa-xu/tflite_elixir.

Fixed

  • [erlang] Generate correct error message from a list of errors.
  • [c_src] Initialize resource pointers with nullptr.
  • Implemented tokenizers for MobileBERT (#57) by @cocoa-xu.
  • [make] Ensure priv dir exist.

v0.2.1 (2023-04-02)

Browse the Repository | Released Assets

Changed

  • [deps] Use TensorFlow Lite version 2.11.1.

Fixed

  • [erlang] Generate correct error message from a list of errors.
  • [c_src] Initialize resource pointers with nullptr.
  • Implemented tokenizers for MobileBERT (#57) by @cocoa-xu.
  • [make] Ensure priv dir exist.

v0.2.0 (2023-03-30)

Browse the Repository | Released Assets

Breaking Changes

  • Renamed root namespace from TFLiteElixir to TFLiteBEAM

Changes

  • buffer will be copied and managed when using TFLiteBEAM.FlatBufferModel.build_from_buffer/1.
  • TFLiteBEAM.TFLiteTensor.dims/1 returns a list (following TensorFlow Lite's C++ API convention) while TFLiteBEAM.TFLiteTensor.shape/1 returns a tuple (folllowing nx's convention.)

Added

  • Erlang support.

  • [example] added pose estimation example (#43) by @mnishiguchi

  • [example] use thunder model instead of lightning in pose estimation (#45) by @mnishiguchi

  • [example] added audio classification example

  • Experimental high-level module TFLiteBEAM.ImageClassification.

    iex> alias TFLiteBEAM.ImageClassification
    iex> {:ok, pid} = ImageClassification.start("test/test_data/mobilenet_v2_1.0_224_inat_bird_quant.tflite")
    iex> ImageClassification.predict(pid, "test/test_data/parrot.jpeg")
    %{class_id: 923, score: 0.70703125}
    iex> ImageClassification.set_label_from_associated_file(pid, "inat_bird_labels.txt")
    :ok
    iex> ImageClassification.predict(pid, "test/test_data/parrot.jpeg")
    %{class_id: 923, label: "Ara macao (Scarlet Macaw)", score: 0.70703125}
    iex> ImageClassification.predict(pid, "test/test_data/parrot.jpeg", top_k: 3)
    [
      %{class_id: 923, label: "Ara macao (Scarlet Macaw)", score: 0.70703125},
      %{
        class_id: 837,
        label: "Platycercus elegans (Crimson Rosella)",
        score: 0.078125
      },
      %{
        class_id: 245,
        label: "Coracias caudatus (Lilac-breasted Roller)",
        score: 0.01953125
      }
    ]

v0.1.7 (2023-03-22)

Browse the Repository | Released Assets

Breaking Changes

  • Deprecated TFLiteElixir.Interpreter.allocate_tensors!/1
  • Deprecated Access behaviour for TFLiteElixir.FlatBufferModel

Fixed

  • Properly implemented TFLiteElixir.FlatBufferModel.read_all_metadata/1.

    iex> filename = Path.join([__DIR__, "test", "test_data", "mobilenet_v2_1.0_224_inat_bird_quant.tflite"])
    iex> %FlatBufferModel{} = model = FlatBufferModel.build_from_buffer(File.read!(filename))
    iex> TFLiteElixir.FlatBufferModel.read_all_metadata(model)
    %{
      TFLITE_METADATA: %{
        description:
          "Identify the most prominent object in the image from a known set of categories.",
        min_parser_version: "1.0.0",
        name: "ImageClassifier",
        subgraph_metadata: [
          %{
            input_tensor_metadata: [
              %{
                content: %{
                  content_properties: %{color_space: "RGB"},
                  content_properties_type: "ImageProperties"
                },
                description: "Input image to be classified.",
                name: "image",
                process_units: [
                  %{
                    options: %{mean: [127.5], std: [127.5]},
                    options_type: "NormalizationOptions"
                  }
                ],
                stats: %{max: [255.0], min: [0.0]}
              }
            ],
            output_tensor_metadata: [
              %{
                associated_files: [
                  %{
                    description: "Labels for categories that the model can recognize.",
                    name: "inat_bird_labels.txt",
                    type: "TENSOR_AXIS_LABELS"
                  }
                ],
                description: "Probabilities of the labels respectively.",
                name: "probability",
                stats: %{max: [255.0], min: [0.0]}
              }
            ]
          }
        ]
      },
      min_runtime_version: "1.5.0"
    }

Changed

  • Improve TFLiteElixir.TFLiteTensor.to_nx/2 (#33) by @cocoa-xu
  • [doc] Improve doc for to_nx (#31) by @mnishiguchi

Added

  • Implemented
    • FlatBufferModel.{list_associated_files/1,get_associated_file/2}
    • TFLiteElixir.Interpreter.signature_keys/1
    • TFLiteElixir.Interpreter.execution_plan/1
    • TFLiteElixir.Interpreter.new_from_buffer/1
    • TFLiteElixir.Interpreter.tensors_size/1
    • TFLiteElixir.Interpreter.variables/1
    • TFLiteElixir.Interpreter.set_variables/2
    • TFLiteElixir.Interpreter.set_inputs/2
    • TFLiteElixir.Interpreter.set_outputs/2
  • [example] object detection example (#40) by @mnishiguchi

v0.1.6 (2023-03-19)

Browse the Repository | Released Assets

Fixed

  • [edgetpu] Improved edgetpu context handling, and bumped libedgetpu_runtime_version to v0.1.5. Fixed #30

Added

  • [example] artistic-style-transfer example (#27) @mnishiguchi

v0.1.5 (2023-03-18)

Browse the Repository | Released Assets

Breaking Changes

  • Deprecated functions:
    • TFLiteElixir.FlatBufferModel.initialized!/1
    • TFLiteElixir.FlatBufferModel.get_minimum_runtime!/1
    • TFLiteElixir.TFLiteTensor.tensor!
    • TFLiteElixir.TFLiteTensor.to_nx!
    • TFLiteElixir.TFLiteTensor.to_binary!
    • TFLiteElixir.FlatBufferModel.build_from_buffer!
    • TFLiteElixir.FlatBufferModel.get_full_signature_list
  • TFLiteElixir.Coral.get_edge_tpu_context/1 now takes keyword options.

Changes

  • [example] Improve Inference on TPU notebook (#15) @mnishiguchi
  • [example] Improve Inference on TPU notebook (#16) @mnishiguchi
  • Alias modules in tflite_interpreter (#17) @mnishiguchi
  • Rename elixir files based on module names (#18) @mnishiguchi
  • add moduledocs (#19) @mnishiguchi

Fixed

  • Fixed a few places that could lead to segmentation fault.
  • [example] Fixed broken ESRGAN link, Visualize the result section in the "Super Resolution" notebook. Lock down tflite_elixir and evision version (#29) @mnishiguchi.
  • [typespec] Fixed typespec for TFLiteElixir.Coral.edge_tpu_devices/0 (#22) @mnishiguchi.

Added

  • [test] Unit tests for TFLiteElixir.Interpreter, TFLiteElixir.InterpreterBuilder and TFLiteElixir.Ops.Builtin.BuiltinResolver.
  • [example] Added intro text to super_resolution_example. (#26) @mnishiguchi.
  • TFLiteElixir.FlatBufferModel.error_reporter/1.
  • TFLiteElixir.FlatBufferModel.verify_and_build_from_file/2

v0.1.4 (2023-03-14)

Browse the Repository | Released Assets

Breaking Changes

  • Snake case functions (#21) @mnishiguchi

Changes

  • [example] Improve Inference on TPU notebook (#15) @mnishiguchi
  • [example] Improve Inference on TPU notebook (#16) @mnishiguchi
  • Alias modules in tflite_interpreter (#17) @mnishiguchi
  • Rename elixir files based on module names (#18) @mnishiguchi
  • add moduledocs (#19) @mnishiguchi

Fixed

  • Fix compilation logic when not using precompiled binaries.

Added

  • Implemented TFLiteElixir.reset_variable_tensor/1.
  • Add support for armv6.

Misc

  • Simple workaround for cortex-a53 and cortex-a57, vcvtaq_s32_f32.

v0.1.3 (2023-03-09)

Browse the Repository | Released Assets

Changes

v0.1.2 (2023-03-08)

Browse the Repository | Released Assets

First release on hex.pm.