Dask DataFrame - Keras 模型的预测

Dask DataFrame - Prediction of Keras Model

我第一次使用 dask 并尝试从训练有素的 keras 模型中 运行 predict()。

如果我不使用 dask,该函数可以正常工作(即 pd.DataFrame() 与 dd.DataFrame () )。使用 Dask,错误如下。这不是一个常见的用例吗(除了对 groupby 进行评分之外)

def calc_HR_ind_dsk(grp):
    model=keras.models.load_model('/home/embedding_model.h5')
    topk=10

    x=[grp['user'].values,grp['item'].values]
    pred_act=list(zip(model.predict(x)[:,0],grp['respond'].values))
    top=sorted(pred_act, key=lambda x: -x[0])[0:topk]
    hit=sum([x[1] for x in top])
    return(hit)



import dask.dataframe as dd

#step 1 - read in data as a dask df. We could reference more than 1 files using '*' wildcard
df = dd.read_csv('/home/test_coded_final.csv',dtype='int64')
results=df.groupby('user').apply(calc_HR_ind_dsk).compute()

TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder_30:0", shape=(55188, 32), dtype=float32) 不是该图的元素。

看看: http://dask.pydata.org/en/latest/dataframe-api.html#dask.dataframe.groupby.DataFrameGroupBy.apply 与 pandas 不同,在 dask 中,许多让您定义自己的自定义操作的函数需要 meta 参数。没有这个 dask 将以某种方式测试您的自定义函数并将奇怪的东西传递给 keras,这在调用计算期间可能不会发生。

我找到了答案。这是keras或tensorflow的问题:https://github.com/keras-team/keras/issues/2397

下面的代码有效,使用 dask 比标准 pandas groupby 节省了 50% 的时间。

#dask
model=keras.models.load_model('/home/embedding_model.h5')

#this part
import tensorflow as tf
global graph
graph = tf.get_default_graph()


def calc_HR_ind_dsk(grp):
    topk=10
    x=[grp['user'].values,grp['item'].values]

    with graph.as_default(): #and this part from https://github.com/keras-team/keras/issues/2397
        pred_act=list(zip(model.predict(x)[:,0],grp['respond'].values))
    top=sorted(pred_act, key=lambda x: -x[0])[0:topk]
    hit=sum([x[1] for x in top])

    return(hit)



import dask.dataframe as dd


df = dd.read_csv('/home/test_coded_final.csv',dtype='int64')
results=df.groupby('user').apply(calc_HR_ind_dsk).compute()

我写的一个不同的答案可能对这里有帮助(用例是使用带有预训练 ML 模型的 Dask 来预测 1,000,000 个示例):