Keras モデルがありますが、移植を容易にするために正規化値をモデル オブジェクト自体に保存したいと考えています。
sklearn の StandardScaler() を使用してデータを正規化しているので、単純に、mean_ 属性と var_ 属性をスケーラーからモデルに保存し、モデルを保存して、モデルをリロードするときにこれらの属性にアクセスできるようにしたいだけです。
現在、モデルをリロードすると、追加した属性が表示されません。これを行う正しい方法は何ですか?
コード:
# Normalize data
scaler = StandardScaler()
scaler.fit(X_train)
...
# Create model
model = Sequential(...)
# Compile and train
...
# Save model with normalization mean and var
model.normalization_mean = scaler.mean_
model.normalization_var = scaler.var_
keras.models.save_model(model = model,
filepath = ...)
# Reload model
model = keras.models.load_model(filepath = ...)
hasattr(model, 'normalization_mean') # False
hasattr(model, 'normalization_var') # False
------------------------
これは可能性があります...この方法でモデルのサブクラスを作成し、外部オブジェクトを割り当てることができますトレーニング不可能な変数のような
X = np.random.uniform(0,1, (100,10))
y = np.random.uniform(0,1, 100)
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.dense1 = Dense(32)
self.dense2 = Dense(1)
def call(self, inputs):
x = self.dense1(inputs)
return self.dense2(x)
model = MyModel()
model.compile('adam','mse')
model.fit(X,y)
model._normalization_mean = tf.Variable([111.], trainable=False)
model._normalization_var = tf.Variable([222.], trainable=False)
model.save('abc.tf', save_format='tf')
model = tf.keras.models.load_model(filepath = 'abc.tf')
モデルをロードした後、呼び出すことができます
model._normalization_mean.numpy()
# array([111.], dtype=float32)
こちらがランニングノートブックです
サブクラス モデルを保存およびロードするには、これを参照できます
1
1
trainable=False を指定して属性を tf.Variable として保存するとうまくいきました。
– ガブリエル・シア
2020 年 9 月 7 日 8:59
------------------------
ちょうどあなたが説明しているとおりの目的を持つ Keras 前処理レイヤーを見つけました。
Keras 前処理レイヤー API を使用すると、開発者は Keras ネイティブの入力処理パイプラインを構築できます。これらの入力処理パイプラインは、Keras 以外のワークフローで独立した前処理コードとして使用したり、Keras モデルと直接組み合わせたり、Keras SavedModel の一部としてエクスポートしたりできます。
Keras 前処理レイヤーを使用すると、真にエンドツーエンドのモデルを構築してエクスポートできます。つまり、生の画像または生の構造化データを入力として受け入れるモデルです。特徴の正規化または特徴値のインデックス付けを独自に処理するモデル。
1
1
これらの前処理レイヤーがモデルとともに自動的に保存されるとは思えません
– MattiH
2022 年 1 月 16 日 17:40