簡體   English   中英

Keras模型:TypeError:無法腌制_thread.lock對象

[英]Keras model: TypeError: can't pickle _thread.lock objects

我在PySpark中使用訓練有素的Keras模型遇到麻煩。 使用以下版本的庫:

tensorflow==1.1.0
h5py==2.7.0
keras==2.0.4

另外,我使用Spark 2.4.0。

from pyspark.sql import SparkSession
import pyspark.sql.functions as func
from keras.models import load_model

spark = SparkSession \
    .builder \
    .appName("Test") \
    .master("local[2]") \
    .getOrCreate()

my_model = load_model("my_model.h5")
spark.sparkContext.addFile("my_model.h5")
my_model_bcast = spark.sparkContext.broadcast(my_model)

# ...

get_prediction_udf = func.udf(get_prediction, IntegerType())
ds = ds\
    .withColumn("predicted_value", get_prediction_udf(my_model_bcast,
                                                      func.col("col1"),
                                                      func.col("col2"))))

函數get_prediction如下所示(簡化代碼):

def get_prediction(my_model_bcast, col1, col2):
    cur_state = np.array([col1,col2])
    state = cur_state.reshape(1,2)
    ynew = my_model_bcast.predict(state)
    return np.argmax(ynew[0])

以下錯誤由行my_model_bcast = spark.sparkContext.broadcast(my_model)觸發:

  File "/usr/local/spark-2.4.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/broadcast.py", line 110, in dump
    pickle.dump(value, f, 2)
TypeError: can't pickle _thread.lock objects

我正在閱讀類似的主題,以便找到解決方案。 據我了解, keras不支持應用pickle 但是在這種情況下,如何使用經過訓練的模型在PySpark中進行預測?

似乎不可能序列化keras模型,所以也許只分發文件並作為spark文件? 那么在函數內部(您希望模型作為輸入),您可以從該路徑讀取文件並在其中創建模型嗎?

path = SparkFiles.get("mode_file.h5")
model =  load_model(path)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM