在pyspark使用Keras序列化模型和dropout

时间:2017-03-14 10:02:43

标签: python pyspark keras

我有几个使用Keras构建的神经网络,我到目前为止主要使用的是Jupyter。我经常使用joblib和Keras用json + hdf5来学习scikit-learn的模型,并且在其他笔记本中使用它们没有问题。

我制作了一个Python Spark应用程序,可以在集群模式下使用这些序列化模型。 joblib模型工作正常,但我遇到了Keras的问题。

这是笔记本和pyspark中使用的模型:

def build_gru_model():
    model = Sequential()
    model.add(Embedding(max_nb_words, 128, input_length=max_sequence_length, dropout=0.2))
    model.add(GRU(128, dropout_W=0.2, dropout_U=0.2))
    model.add(Dense(2, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

两者都采用相同的方式:

preds = model.predict_proba(data, verbose=0)

但是,只有在Spark中我才会收到错误:

MissingInputError: ("An input of the graph, used to compute DimShuffle{x,x,x,x}(keras_learning_phase), was not provided and not given a value.Use the Theano flag exception_verbosity='high',for more information on this error.", keras_learning_phase)

我完成了强制性搜索,发现:https://github.com/fchollet/keras/issues/2430指向https://keras.io/getting-started/faq/

如果我确实从模型中删除了dropout,它就可以了。但是,我无法理解如何实施能让我在培训阶段保持辍学的内容,如常见问题解答所述。

根据型号代码,如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

您可以尝试(在预测之前)

import keras.backend as K
K.set_learning_phase(0)

应将学习阶段设置为0(测试时间)