我正在尝试使用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_norm
,i2_norm
和i3_norm
是分别具有形状(3, 128, 128, 1)
,(3, 32, 32, 1)
和(3, 4)
的归一化张量。所以我想要3个样本的SHAP图像。
在我看来,我给它提供了input_3
的张量,它应该仅将其用作“占位符”。诚然,我只使用Keras而不是纯Tensorflow,所以我不太确定它的期望或提供方式。非常感谢这里的任何解决方案!