1

我有一个训练有素的 keras 模型。

https://github.com/qubvel/efficientnet

我有一个大型更新数据集,我想对其进行预测。意思是每 2 小时左右运行一次我的 spark 工作。

实现这一点的方法是什么?MlLib 不支持高效网络。

在网上搜索时,我看到这种使用 sparkdl 的实现,但它不支持 efficentNet 作为 modelName 参数。

featurizer = DeepImageFeaturizer(inputCol="image", outputCol="features", modelName="InceptionV3")
rf = RandomForestClassifier(labelCol="label", featuresCol="features")

我天真的方法是

import efficientnet.keras as efn 
model = efn.EfficientNetB0(weights='imagenet')
from sparkdl import readImages

image_df = readImages("flower_photos/sample/")
image_df.withcolumn("modelTags", efficient_net_udf($"image".data))

并创建一个调用 model.predict 的 UDF...

我看到的另一种方法是

from keras.preprocessing.image import img_to_array, load_img
import numpy as np
import os
from pyspark.sql.types import StringType
from sparkdl import KerasImageFileTransformer

import efficientnet.keras as efn 
model = efn.EfficientNetB0(weights='imagenet')
model.save("kerasModel.h5")

def loadAndPreprocessKeras(uri):
  image = img_to_array(load_img(uri, target_size=(299, 299)))
  image = np.expand_dims(image, axis=0)
  return image 

transformer = KerasImageFileTransformer(inputCol="uri", outputCol="predictions",
                                        modelFile='path/kerasModel.h5', 
                                        imageLoader=loadAndPreprocessKeras,
                                        outputMode="vector")

files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir("/data/myimages") if f.endswith('.jpg')]
uri_df = sqlContext.createDataFrame(files, StringType()).toDF("uri")

keras_pred_df = transformer.transform(uri_df)

解决此问题的正确(和有效)方法是什么?

4

0 回答 0