我有一个简单的代码片段用于训练模型,但是当我使用pickle保存模型以便将来使用时,它会给我一个错误信息:
cannot pickle thread.LOCK objects
我尝试了多种格式使用pickle,但它仍然给我相同的错误。
import picklemodel = keras.Sequential([ keras.layers.Dense(SHAPE, input_shape=(SHAPE,)), keras.layers.Dense(300, activation='sigmoid'), keras.layers.Dense(10, activation='softmax')])#****************** 编译模型 *****************LEARNING_RATE = 0.0005model.compile(optimizer=keras.optimizers.Adam(lr=LEARNING_RATE), loss='sparse_categorical_crossentropy', metrics=['accuracy'] )# *********** 训练模型 **********EPOCHS = 20BATCH_SIZE=50history_original_data = model.fit(X_original_train_images, y_original_train_labels, epochs=EPOCHS, batch_size=BATCH_SIZE) hist_original=history_original_data.history### 使用pickle保存模型以便无需预训练即可使用pickname ="SequentialNeuroNetwork.pkl"PickleSeq = open(pickname, 'wb')pickle.dump(model, PickleSeq)PickleSeq.close()
我期望上述代码片段能够顺利运行,但它却让我感到非常头疼。
回答:
您使用的是哪个版本的keras?我几乎可以肯定,旧版本不支持pickle。
或者,建议使用model.save()
来保存您的keras模型。正如keras常见问题页面中所述:
您可以使用
model.save(filepath)
将Keras模型保存到一个单一的HDF5文件中,该文件将包含:
- 模型的架构,允许重新创建模型
- 模型的权重
- 训练配置(损失函数,优化器)
- 优化器的状态,允许您从上次中断的地方继续训练。
然后,您可以使用
keras.models.load_model(filepath)
来重新实例化您的模型。load_model还将使用保存的训练配置来编译模型(除非模型从未编译过)。
来源:https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model