如何将tensorflow模型保存到pickle文件
how to save tensorflow model to pickle file
我想保存一个 Tensorflow 模型,然后将其用于部署目的。我不想使用 model.save()
来保存它,因为我的目的是以某种方式 'pickle' 它并在未安装 tensorflow 的不同系统中使用它,例如:
model = pickle.load(open(path, 'rb'))
model.predict(prediction_array)
早些时候使用 sklearn,当我 pickle KNN 模型时,它是成功的,我能够 运行 推理而无需安装 sklearn。
但是当我尝试 pickle 我的 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
这里有一个关于这个问题的 ,但是答案中的 link 已经过期了。
这里还有,不过我没看懂
我有一个非常简单的模型,没有检查点,没什么复杂的,那么有什么方法可以将 Tensorflow 模型对象保存到二进制文件中吗?或者即使它有多个二进制文件,我不介意,但它不需要使用 tensoflow,如果 有帮助,我会使用它,但我不知道如何在这里实现它。任何帮助将不胜感激,谢谢!
使用 joblib
似乎适用于 TF
2.8,并且由于您有一个非常简单的模型,您可以在 Google Colab 上对其进行训练,然后只需在您的上使用 pickled 文件其他系统:
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)
但如果不知道您的系统规格,很难判断它是否真的是“straight-forward”。
我想保存一个 Tensorflow 模型,然后将其用于部署目的。我不想使用 model.save()
来保存它,因为我的目的是以某种方式 'pickle' 它并在未安装 tensorflow 的不同系统中使用它,例如:
model = pickle.load(open(path, 'rb'))
model.predict(prediction_array)
早些时候使用 sklearn,当我 pickle KNN 模型时,它是成功的,我能够 运行 推理而无需安装 sklearn。
但是当我尝试 pickle 我的 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
这里有一个关于这个问题的
这里还有
我有一个非常简单的模型,没有检查点,没什么复杂的,那么有什么方法可以将 Tensorflow 模型对象保存到二进制文件中吗?或者即使它有多个二进制文件,我不介意,但它不需要使用 tensoflow,如果
使用 joblib
似乎适用于 TF
2.8,并且由于您有一个非常简单的模型,您可以在 Google Colab 上对其进行训练,然后只需在您的上使用 pickled 文件其他系统:
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)
但如果不知道您的系统规格,很难判断它是否真的是“straight-forward”。