在Python中将TensorFlow模型(集成)保存到一个pickle文件,而不是多个pickle文件

在Python中将TensorFlow模型(集成)保存到一个pickle文件,而不是多个pickle文件,python,pandas,tensorflow,keras,pickle,Python,Pandas,Tensorflow,Keras,Pickle,我希望为一个回归问题部署一个50个模型集合,每个模型都是一个Keras.序列神经网络 下面是我的代码的一个(简化为3个模型)版本,运行良好 但是,我不想为每个单独的模型创建一个pickle文件,因此有没有一种方法可以创建一个包含所有模型列表的类,从而导致我只能保存/加载一个pickle文件 from __future__ import absolute_import, division, print_function import tensorflow as tf from tensorflow

我希望为一个回归问题部署一个50个模型集合,每个模型都是一个Keras.序列神经网络

下面是我的代码的一个(简化为3个模型)版本,运行良好

但是,我不想为每个单独的模型创建一个pickle文件,因此有没有一种方法可以创建一个包含所有模型列表的类,从而导致我只能保存/加载一个pickle文件

from __future__ import absolute_import, division, print_function
import tensorflow as tf
from tensorflow import keras
import pandas as pd
import numpy as np

train = pd.read_csv("Training Data.csv").fillna(0)
X_train = train.drop(['ID_NUMBER','DATE','X','Y','Z'],axis=1)
Y_train = train[['X','Y','Z']]

EPOCHS = 1500
BATCH_SIZE = 256

#Defining the 3 layered Neural Network
def build_model():
    model = keras.Sequential([
    keras.layers.Dense(1000, activation=tf.nn.softplus,
                       input_shape=(X_train.shape[1],)),
    keras.layers.Dense(500, activation=tf.nn.softplus),
    keras.layers.Dense(3)
    ])

    model.compile(loss='mse',optimizer='adam', metrics=['mse'])
    return model

model0 = build_model()
# Store training stats
history0 = model0.fit(X_train, Y_train, epochs=EPOCHS, batch_size=BATCH_SIZE,
                validation_split=0.0, verbose=1)

model1 = build_model()
# Store training stats
history1 = model1.fit(X_train, Y_train, epochs=EPOCHS, batch_size=BATCH_SIZE,
                validation_split=0.0, verbose=1)

model2 = build_model()
# Store training stats
history2 = model2.fit(X_train, Y_train, epochs=EPOCHS, batch_size=BATCH_SIZE,
                validation_split=0.0, verbose=1)

model0.save("model0.pkl")
model1.save("model1.pkl")
model2.save("model2.pkl")
为了做出新的预测,我的代码如下所示:

#Loading Models
model0 = tf.keras.models.load_model("model0.pkl")
model1 = tf.keras.models.load_model("model1.pkl")
model2 = tf.keras.models.load_model("model2.pkl")

#Finding Weights (based on train score)

train_nn_predictions = model0.predict(X_train)
train['X'],train['Y'],train['Z'] = train_nn_predictions[:,0],train_nn_predictions[:,1],train_nn_predictions[:,2]     
nn0 = #training score metric (irrelevant to show how it is calculated here)
print("Average Train Score for Model 0 is:",nn0)

train_nn_predictions = model1.predict(X_train)
train['X'],train['Y'],train['Z'] = train_nn_predictions[:,0],train_nn_predictions[:,1],train_nn_predictions[:,2]     
nn1 = #training score metric (irrelevant to show how it is calculated here)
print("Average Train Score for Model 1 is:",nn1)

train_nn_predictions = model2.predict(X_train)
train['X'],train['Y'],train['Z'] = train_nn_predictions[:,0],train_nn_predictions[:,1],train_nn_predictions[:,2]     
nn2 = #training score metric (irrelevant to show how it is calculated here)
print("Average Train Score for Model 2 is:",nn2)

#Apply the weightings for each of the models
w0,w1,w2 = 1/nn0,1/nn1,1/nn2

#New Predictions
new_record = np.array([my variables])
target_predictions = (w0*model0.predict(new_record)+w1*model1.predict(new_record)+w2*model2.predict(new_record))/(w0+w1+w2)
您可以尝试:

  • 使用层合并所有模型。连接。它将为所有50个模型创建一个输出。有关代码检查的更多详细信息,请参见: 根据:
  • x=np.arange(20)。重塑(2,2,5)

    y=np.arange(20,30)。重塑(2,1,5)

    连接(轴=1)([x,y])

  • 使用KerasPickleWrapper来腌制它 您可以尝试:

  • 使用层合并所有模型。连接。它将为所有50个模型创建一个输出。有关代码检查的更多详细信息,请参见: 根据:
  • x=np.arange(20)。重塑(2,2,5)

    y=np.arange(20,30)。重塑(2,1,5)

    连接(轴=1)([x,y])

  • 使用KerasPickleWrapper来腌制它
    有没有办法创建一个包含模型列表的类?对这容易吗?不需要。您最好只编写几个函数包装加载/保存操作,并将所有pickle保存在一个单独的文件夹中。Smth simple可以做到,比如
    def save_models(model_list,folder):对于idx,枚举中的model(model_list):model.save({}/model{}.pkl.)。format(folder,idx))
    def load_models(foldername):返回[tf.keras.models.load_model(file)for file in blob.blob(foldername+“/*.pkl”)]
    有没有办法创建一个包含模型列表的类?是的。这很简单吗?没有。你最好只编写几个函数包装加载/保存操作,并将所有pickle保存在一个单独的文件夹中。Smth simple可以,比如
    def save_models(model_list,folder):对于idx,枚举中的model(model_list):model.save(“{}/model{}.pkl.format(folder,idx))
    def load_models(foldername):对于blob.blob(foldername+“/*.pkl”)中的文件,返回[tf.keras.models.load_model(file)]
    请将链接内容的重要部分作为报价包含在您自己的答案中,以防止它们因以下原因而消失:请将链接内容的重要部分作为报价包含在您自己的答案中,以防止它们因以下原因而消失: