首页 > 解决方案 > CNN模型中不同类型输入的SHAP解释

问题描述

我有一个问题要使用 SHAP 来解释我的 CNN 模型的结果。我的 CNN 模型采用 2 个不同类型的输入。一个是图像,另一个是特征向量。我通过考虑这两者来训练和测试模型。建立模型没有问题。

当我尝试使用 SHAP 同时解释这两个输入的结果时,它不起作用。我实际上已经尝试过 deepexplainer 和 gradientexplainer。我得到的错误如下:

文件“”,第 1 行,在 shap_values = explainer.shap_values([x_test[:3], feature_test[:3]])

文件“C:\Users\kaz10003\AppData\Local\Continuum\anaconda3\lib\site-> > packages\shap\explainers\deep_init_.py”,第 119 行,在 shap_values 返回 self.explainer.shap_values(X,ranked_outputs, output_rank_order)

文件“C:\Users\kaz10003\AppData\Local\Continuum\anaconda3\lib\site-> packages\shap\explainers\deep\deep_tf.py”,第 284 行,在 shap_values diffs = model_output[:, l] - self .expected_value[l] - > output_phis[l].sum(axis=tuple(range(1, output_phis[l].ndim)))

AttributeError:“列表”对象没有属性“总和”

有人知道SHAP是否支持这种实现吗?这是我的代码:

n_features = 10
input_feat = Input((n_features,))
input_tensor = Input(shape=(50,60, 1))

c3 = Conv2D(32, (3, 3), activation='relu', padding='same') (input_tensor)
c3 = Conv2D(32, (3, 3), activation='relu', padding='same') (c3)
c3 = Conv2D(32, (3, 3), activation='relu', padding='same') (c3)
p3 = MaxPooling2D((2, 2)) (c3)

f_repeat = RepeatVector(6*7)(input_feat)
f_conv = Reshape((6, 7, n_features))(f_repeat)
p3_feat = concatenate([p3, f_conv], -1)

c3 = Flatten()(p3_feat)
c3 = Dense(512)(c3)
outputs = Dense(2, activation='softmax')(c3)
model = Model(inputs=[input_tensor, input_feat], outputs=[outputs])

model.summary()

explainer = shap.GradientExplainer(model, [x_train, feature_train])
shap_values = explainer.shap_values([x_test[:3], feature_test[:3]])

标签: shap

解决方案


推荐阅读