具有多输入CNN模型的GradientExplainer

时间:2019-09-04 13:13:05

标签: python tensorflow keras deep-learning shap

我正在尝试使用SHAP library来查看图像的哪些部分在我用Keras训练的卷积神经网络中很重要(backend = tensorflow)。具体来说,我正在使用 GradientExplainer 。我已经能够在我训练的单输入CNN上遵循链接的示例,但是我无法使其与更复杂的CNN一起使用。

我的CNN具有三个输入,分别是第0、1和(-10)层(最后一个是标量数据)。因此,我已经对map2layer进行了修改:

def map2layer(i1,i2,i3,layer):
    feed_dict = dict(zip([model.layers[1].input,model.layers[0].input,model.layers[-10].input], [i1,i2,i3]))
    for k in feed_dict.keys():
      print(k,feed_dict[k].shape,feed_dict[k].dtype)
    return K.get_session().run(model.layers[layer].input, feed_dict)

我已经确认输入正确地对应于图层的形状和dtypes(请参阅for中的map2layer循环)。另请注意,此处的“背景”数据样本为1000。

Tensor("input_1:0", shape=(?, 128, 128, 1), dtype=float32) (1000, 128, 128, 1) float32
Tensor("input_2:0", shape=(?, 32, 32, 1), dtype=float32) (1000, 32, 32, 1) float32
Tensor("input_3:0", shape=(?, 4), dtype=float32) (1000, 4) float32

这里的一个奇怪之处是,在我的Keras模型摘要中,我的model.layers[0].input被标记为input_2,而model.layers[1].input被标记为input_1。我怀疑这可能是由于随后的up_sampling2d层造成的。这可能与我的问题无关,但想提一下。

我在这条线上出现错误

shap_values,indexes=e.shap_values(map2layer(i1_norm,i2_norm,i3_norm,layer) ranked_outputs=1)

哪个给我这个消息:

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'input_3' with dtype float and shape [?,4]

i1_normi2_normi3_norm是分别具有形状(3, 128, 128, 1)(3, 32, 32, 1)(3, 4)的归一化张量。所以我想要3个样本的SHAP图像。

在我看来,我给它提供了input_3的张量,它应该仅将其用作“占位符”。诚然,我只使用Keras而不是纯Tensorflow,所以我不太确定它的期望或提供方式。非常感谢这里的任何解决方案!

0 个答案:

没有答案