我有一个Keras模型,希望将归一化值保存到model
对象本身中,以便更容易移植。
我使用sklearn的StandardScaler()
来归一化数据,所以我只想将scaler
中的mean_
和var_
属性保存到model
中,保存模型,然后在重新加载模型时可以访问这些属性。
目前,当我重新加载模型时,我添加的属性不在那里。正确的做法是什么?
代码:
# 归一化数据
scaler = StandardScaler()
scaler.fit(X_train)
...
# 创建模型
model = Sequential(...)
# 编译和训练...
# 保存带有归一化均值和方差的模型
model.normalization_mean = scaler.mean_
model.normalization_var = scaler.var_
keras.models.save_model(model = model,
filepath = ...)
# 重新加载模型
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)
这里是运行的笔记本
要保存和加载子类模型,你可以参考这个