【问题标题】:Saving normalization values in Keras model在 Keras 模型中保存归一化值
【发布时间】:2020-09-03 10:39:08
【问题描述】:

我有一个 Keras 模型,我想将其标准化值保存在 model 对象本身中以便于移植。

我正在使用 sklearn 的StandardScaler() 来规范化我的数据,所以我只想将mean_ 和var_ 属性从scaler 保存到model,保存模型,当我重新加载模型可以访问这些属性。

目前,当我重新加载模型时,我添加的属性不存在。这样做的正确方法是什么?

代码:

# 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

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    我刚刚遇到Keras preprocessing layers,其目的似乎正是您所描述的。

    Keras 预处理层 API 允许开发人员构建 Keras 原生输入处理管道。这些输入处理管道可以用作非 Keras 工作流中的独立预处理代码,直接与 Keras 模型结合,并作为 Keras SavedModel 的一部分导出。

    借助 Keras 预处理层,您可以构建和导出真正端到端的模型:接受原始图像或原始结构化数据作为输入的模型;自行处理特征归一化或特征值索引的模型。

    【讨论】:

    • 我不认为这些预处理层会自动与模型一起保存
    【解决方案2】:

    这是一种可能性...您可以创建一个模型子类 in this way 并分配外部对象,例如不可训练的变量

    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)
    

    here正在运行的笔记本

    子类模型的保存和加载可以参考this

    【讨论】:

    • 将属性保存为 tf.Variable 和 trainable=False 成功了,谢谢。
    猜你喜欢
    • 2018-12-14
    • 2019-08-21
    • 2018-06-25
    • 2020-11-15
    • 1970-01-01
    • 2020-05-20
    • 2018-05-02
    • 2022-07-25
    • 2019-01-26
    相关资源
    最近更新 更多