首页 > 解决方案 > Shap DeepExplainer TypeError

问题描述

我第一次尝试在我正在开发的 LSTM 模型上实现 DeepExplainer()。我引用了“用于 IMDB 情绪分类的 Keras LSTM”示例,但我不完全确定我哪里出错了,我相信这是我输入的格式。

我的 LSTM 结构

  inputs = keras.Input(shape=(None,), dtype="int32")
  x = layers.Embedding(vocab_size, 128)(inputs)
  x = layers.Bidirectional(layers.LSTM(64, return_sequences=True))(x)
  x = layers.Bidirectional(layers.LSTM(64))(x)
  outputs = layers.Dense(1, activation="sigmoid")(x)
  model = keras.Model(inputs, outputs)
  model.summary()
  model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
  history = model.fit(X_train, y_train, batch_size=32, epochs=number_epochs, validation_data=(X_test, y_test))

保存我的模型

model.save("models/LSTM_",number_epochs, save_format="h5")

训练/测试数据

形状解释器功能

def shap_explainer(X_train_not_encoded, X_test_not_encoded, X_train_encoded, X_test_encoded, model, word_index):
    
    x_train_100 = X_train_encoded[:100]
    session = backend.get_session()
    explainer = shap.DeepExplainer(model, x_train_100, session)

    num_explanation = 10
    shap_values = explainer.shap_values(X_test_encoded[:num_explanation])

    num2word = {}
    for w in word_index.keys():
        num2word[word_index[w]] = w
    x_test_words = np.stack([np.array(list(map(lambda x: num2word.get(x, "NONE"), X_test_encoded[i]))) for i in range(10)])
    shap.summary_plot(shap_values, feature_names = list(num2word.values()))

    shap.initjs()
    shap.force_plot(explainer.expected_value[0], shap_values[0][0], x_test_words[0])

错误信息

Traceback (most recent call last):
  File "c:/.../Documents/Visual Studio Code Workspace/xai_classification_mixed_data/code/text_classification_model.py", line 197, in <module>
    shap_explainer(X_train_cpy, X_test_cpy, X_train, X_test, model, word_index)
  File "c:/.../Documents/Visual Studio Code Workspace/xai_classification_mixed_data/code/text_classification_model.py", line 178, in shap_explainer
    shap_values = explainer.shap_values(X_test_encoded[:num_explanation])
  File "C:\...\Anaconda3\envs\tf-gpu\lib\site-packages\shap\explainers\_deep\__init__.py", line 124, in shap_values
    return self.explainer.shap_values(X, ranked_outputs, output_rank_order, check_additivity=check_additivity)
  File "C:\...\Anaconda3\envs\tf-gpu\lib\site-packages\shap\explainers\_deep\deep_tf.py", line 308, in shap_values
    sample_phis = self.run(self.phi_symbolic(feature_ind), self.model_inputs, joint_input)
  File "C:\...\Anaconda3\envs\tf-gpu\lib\site-packages\shap\explainers\_deep\deep_tf.py", line 365, in run
    return self.execute_with_overridden_gradients(anon)
  File "C:\...\Anaconda3\envs\tf-gpu\lib\site-packages\shap\explainers\_deep\deep_tf.py", line 401, in execute_with_overridden_gradients
    out = f()
  File "C:\...\Anaconda3\envs\tf-gpu\lib\site-packages\shap\explainers\_deep\deep_tf.py", line 358, in anon
    data = X[i].reshape(shape)
TypeError: 'NoneType' object cannot be interpreted as an integer

任何帮助将非常感激!谢谢

标签: pythontensorflowkeraslstmshap

解决方案


推荐阅读