🐥

Zig の TensorFlow Lite ライブラリを書いた。

2022/08/17に公開

はじめに

Go 向けの TensorFlow Lite ライブラリの go-tflite

https://github.com/mattn/go-tflite

mruby 向けの TensorFlow Lite ライブラリの mruby-tflite

https://github.com/mattn/mruby-tflite

と作ってきて Zig 向けのライブラリを作らない訳には行きませんね。行けませんね!

という訳で作りました。

https://github.com/mattn/zig-tflite

※ インタフェースの大文字小文字は変更するかもしれません。

使い方

使い方は go-tflite とほぼ同じです。

const std = @import("std");
const tflite = @import("zig-tflite");

pub fn main() anyerror!void {
    var m = try tflite.modelFromFile("testdata/xor_model.tflite");
    defer m.deinit();

    var o = try tflite.interpreterOptions();
    defer o.deinit();

    var i = try tflite.interpreter(m, o);
    defer i.deinit();

    try i.allocateTensors();

    var inputTensor = i.inputTensor(0);
    var outputTensor = i.outputTensor(0);

    var input = inputTensor.data(f32);
    var output = outputTensor.data(f32);

    input[0] = 0;
    input[1] = 1;

    try i.invoke();

    var result: f32 = if (output[0] > 0.5) 1 else 0;
    std.log.warn("0 xor 1 = {}", .{result});
}

始めは Zig で ndarray なライブラリを作って機械学習でもさせようかと思っていたのですが、意外と Zig で動的に multi dimension な配列を作るのがダルかったので一旦諦めて、TensorFlow Lite のライブラリを作る事にしました。

残念な話

この TensorFlow Lite のライブラリ自身の問題ではないのですが、Zig には画像を扱えるライブラリが少ない。とにかく少ない。特に画像をリサイズする物はない。これが無いと mnist や映像判別の様な物が作れません。誰か作ってー。

という事で現状は XOR くらいしか推論できません。

おわりに

Zig から使える TensorFlow Lite のライブラリを作りました。良かったら遊んでみて下さい。

Discussion