我有一个keras模型,预训练重量[h5df]约为700mb。我想将它与Apache Spark一起用作广播变量。 1.这似乎不可能,因为keras模型本身不是火花感知且不可序列化。 当谷歌搜索一下时,我找到了Elephas图书馆来完成这项工作。因此尝试在ElephasTransformer中包装Keras预训练模型。这会抛出多个错误(我使用python 2.7)。例如,在Elephas的文件ml_model.py中,“来自pyspark.ml.util import keyword_only”,导入不可用。即使我试图对此进行评论并在代码中进行适当修改,它似乎也无法处理keras模型的广播,因为它会在其中一个密集层中引发张量误差。
如何在apache spark中使用预训练的keras模型作为广播变量?
答案 0 :(得分:2)
我使用SparkFiles
spark.sparkContext.addFile("model_file.h5")
并在本地加载:
from pyspark import SparkFiles
from keras.models import load_model
def f(it):
path = SparkFiles.get("mode_file.h5")
model = load.model(path)
for i in it:
yield ... # Do something
rdd.mapPartitions(f)
答案 1 :(得分:0)
在 Elephas 中,我解决这个问题的方法是将权重设为广播变量,将 yaml 字符串作为参数提供给映射器函数,然后使用加载的 yaml 文件和权重在映射器函数内创建模型 -效果如下:
from tensorflow.keras.models import model_from_yaml
weights = rdd.context.broadcast(model.get_weights())
def mapper_function(yaml_file, ...):
model = model_from_yaml(yaml_file)
model.set_weights(weights.value)