如何将tensorflow模型保存到pickle文件中



我想保存一个Tensorflow模型,然后将其用于部署目的。我不想用model.save()来保存它,因为我的目的是以某种方式"pickle"它,并在没有安装tensorflow的不同系统中使用它,比如:

model = pickle.load(open(path, 'rb'))
model.predict(prediction_array)

早期使用sklearn时,当我对KNN模型进行酸洗时,它是成功的,并且我能够在不安装sklearn的情况下运行推理。

但当我试图修改Tensorflow模型时,我得到了这个错误:

Traceback (most recent call last):
File "e:/VA_nlu_addition_branch_lite/nlu_stable2/train.py", line 21, in <module>
pickle.dump(model, open('saved/model.p', 'wb'))
TypeError: can't pickle _thread.RLock objects

我的模型是这样的:

model = keras.Sequential([
keras.Input(shape=(len(x[0]))),
keras.layers.Dense(units=16, activation='elu'),
keras.layers.Dense(units=8, activation='elu'),
keras.layers.Dense(units=len(y[0]), activation='softmax'),
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x, y, epochs=200, batch_size=8)
pickle.dump(model, open('saved/model.p', 'wb'))

型号摘要

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense (Dense)                (None, 16)                1680
_________________________________________________________________
dense_1 (Dense)              (None, 8)                 136
_________________________________________________________________
dense_2 (Dense)              (None, 20)                180
=================================================================
Total params: 1,996
Trainable params: 1,996
Non-trainable params: 0

这里有一个关于这个问题的StackOverflow问题,但答案中的链接已过期。

这里还有另一个类似的问题,但我不太明白

我有一个非常简单的模型,没有检查点,没有太复杂的东西,所以有没有办法将Tensorflow模型对象保存到二进制文件中?或者,即使它有多个二进制文件,我也不介意,但它不需要使用tensoflow,如果numpy解决方案有帮助,我会使用它,但我不知道如何在这里实现它。任何帮助都将不胜感激,谢谢!

使用joblib似乎可以在TF2.8上工作,因为你有一个非常简单的模型,你可以在Google Colab上训练它,然后在你的另一个系统上使用pickle文件:

import joblib
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(5,)),
tf.keras.layers.Dense(units=16, activation='elu'),
tf.keras.layers.Dense(units=8, activation='elu'),
tf.keras.layers.Dense(units=5, activation='softmax'),
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
x = tf.random.normal((20, 5))
y = tf.keras.utils.to_categorical(tf.random.uniform((20, 1), maxval=5, dtype=tf.int32))
model.fit(x, y, epochs=200, batch_size=8)
joblib.dump(model, 'model.pkl')

tf:的负载模型

import joblib
import numpy as np
print(joblib.__version__)
model = joblib.load("/content/model.pkl")
print(model(np.random.random((1,5))))
1.1.0
tf.Tensor([[0.38729233 0.04049021 0.06067584 0.07901421 0.43252742]], shape=(1, 5), dtype=float32)

但很难说这是否真的是";"直向前";而不知道您的系统规格。

对于使用keras创建的TensorFlow模型,请将模型保存在.h5扩展中,如以下类似答案所述:

错误,TensorSliceReader构造函数不成功:找不到任何匹配的文件供ram取消拾取文件:

from tensorflow.keras.models import load_model as tfk__load_model
# ...
# fit model:
# model.fit(x, y, ...)
# save fitted model to file
model.save('model.h5')
# load fitted model
fitted_model = tfk__load_model('model.h5')

最新更新