見出し画像

TensorFlow Liteへの変換で`missing attribute 'value'`エラー

Keras形式やSaved Model形式のモデルをTensorFlow Liteで使えるように `tf.lite.TFLiteConverter` で変換しようとした際のエラー対処です。

loc(fused["ReadVariableOp:", “model/dence_1/Add/ReadVariableOp@__inference_serving_default_10100"]): error: missing attribute 'value'
LLVM ERROR: Failed to infer result type(s).

結論

`tf_keras` をインストールします。

pip install -U tf_keras

`tensorflow` インポートする前に以下を書いておきます。

import os
os.environ["TF_USE_LEGACY_KERAS"] = "1"

環境

  • Python 3.11.9

  • tensorflow-macos 2.16.1

Google Colabで`tensorflow 2.16.1`を使った場合も同じエラーとなりました。

試したコードはGoogleのドキュメントに記載されているサンプルコードです。

一部コードを修正しています。

import numpy as np
import tensorflow as tf

# シンプルな Keras モデルを構築
x = np.array([-1, 0, 1, 2, 3, 4])
y = np.array([-3, -1, 1, 3, 5, 7])

model = tf.keras.models.Sequential(
    [tf.keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(x, y, epochs=1)

# モデルを変換
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

NGパターン

  • Python 3.11.9

  • tensorflow 2.16.1

  • keras 3.3.3

TensorFlowの`2.16.1`をインストールすると一緒にインストールされるKerasは`3.3.3`となっているようです。
この状態でKeras形式やSaved Model形式に保存して再読み込みは問題無いのですが、TensorFlow Liteに変換しようとするとエラーとなります。

以下のコードを追加することで変換時のログを詳細に出力することが出来ます。

tf.debugging.set_log_device_placement(True)

OKパターン

TensorFlowのバージョンを下げる

  • Python 3.11.9 (3.10.14でもOK)

  • tensorflow 2.15.0

  • keras 2.15.0

以下のISSUEで `tensorflow 2.15.0`だとエラーにならないよとコメントされていたので試したところエラーは発生せずに変換できました。

TensorFlowのバージョンを下げずにTF-Kerasをインストールする

  • Python 3.11.9 (3.10.14は未検証)

  • tensorflow 2.16.1

  • keras 3.3.3

  • tf_keras: 2.16.0

先ほどのISSUEからのリンクにある以下で、さらに詳しく見ていくと `tensorflow 2.16.1` で入る `keras` について言及され、`tf_keras` をインストールして使ったらどうかとコメントがあったので試すとエラーは発生せずに変換できました。

`tf_keras` インストール後に確認に使ったコードは以下です。

import os
os.environ["TF_USE_LEGACY_KERAS"] = "1"

import numpy as np
import tensorflow as tf

# シンプルな Keras モデルを構築
x = np.array([-1, 0, 1, 2, 3, 4])
y = np.array([-3, -1, 1, 3, 5, 7])

model = tf.keras.models.Sequential(
    [tf.keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(x, y, epochs=1)

# モデルを変換
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

Kerasのバージョン間の変換

既存のモデルが `keras 3.3.3` で保存されていると、`tf_keras 2.16.0` で読み込む際にエラーになります。
この変換も出来たらいいなと少し調べましたが、簡単には出来なさそうだったのでひとまず再訓練して保存することになりそうです。

この記事が気に入ったらサポートをしてみませんか?