首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Keras模型的SHAP :操作数无法与shapes (2,6) (10,)一起广播

使用Keras模型的SHAP :操作数无法与shapes (2,6) (10,)一起广播
EN

Stack Overflow用户
提问于 2020-01-14 05:27:44
回答 1查看 291关注 0票数 1

我正在运行R中的库shapper中的SHAP,用于在Keras CNN模型上进行分类模型:

代码语言:javascript
复制
library(keras)
library("shapper")
library("DALEX")

我做了一个简单的可重现的例子。

代码语言:javascript
复制
mdat.train <- cbind(rep(1:2, each = 5), matrix(c(1:30), ncol = 3, byrow = TRUE))
train.conv <- array_reshape(mdat.train[,-1], c(nrow(mdat.train[,-1]), ncol(mdat.train[,-1]), 1))

mdat.test <- cbind(rep(1:2, each = 3), matrix(c(1:18), ncol = 3, byrow = TRUE))
test.conv <- array_reshape(mdat.test[,-1], c(nrow(mdat.test[,-1]), ncol(mdat.test[,-1]), 1))

我的CNN模型

代码语言:javascript
复制
model.CNN <- keras_model_sequential()
model.CNN %>% 
  layer_conv_1d(filters=16L, kernel_initializer=initializer_he_normal(seed=NULL), kernel_size=2L, input_shape = c(dim(train.conv)[[2]],1)) %>%
  layer_batch_normalization() %>%
  layer_activation_leaky_relu() %>%

  layer_flatten() %>%
  layer_dense(50, activation ="relu") %>%
  layer_dropout(rate=0.5) %>%
  layer_dense(units=2, activation ='sigmoid')

model.CNN %>% compile(
  loss = loss_binary_crossentropy,
  optimizer = optimizer_adam(lr = 0.001, beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-08),
  metrics = c("accuracy"))

model.CNN %>% fit(
  train.conv, mdat.train[,1], epochs = 5, verbose = 1)

我的Shap命令

代码语言:javascript
复制
p_function <- function(model, data) predict(model.CNN, test.conv, type = "prob")
exp_cnn <- explain(model.CNN, data = train.conv)
ive_cnn <- shap(exp_cnn, data = train.conv, new_observation = test.conv, predict_function = p_function)

我得到了这个错误:

代码语言:javascript
复制
Error in py_call_impl(callable, dots$args, dots$keywords) : 
  ValueError: operands could not be broadcast together with shapes (2,6) (10,) 

Detailed traceback: 
  File "/.local/lib/python3.6/site-packages/shap/explainers/kernel.py", line 120, in __init__
    self.fnull = np.sum((model_null.T * self.data.weights).T, 0)
EN

回答 1

Stack Overflow用户

发布于 2020-02-28 08:58:21

您提出的问题有两个步骤。首先,显示的错误来自于代码拼写错误。您显示的p_function调用的是全局对象,而不是传递的对象。这就是为什么你会看到这个错误。

但令我惊讶的是,我发现即使在澄清了这个错误之后,软件包也无法工作。让我解释一下动机和解决方案。

不得不说,3D数组在R中并不常见,因此shapper包不支持该类型的训练数据。它在任务开始时采用data.frame格式(因为它迭代变量)。老实说,我花了两个小时才找到了为什么它不能像解决方案那样工作的原因。

首先,我们需要能够理解shapper的新变量。

代码语言:javascript
复制
shapper_data <- as.data.frame(train.conv)
shapper_new_obs <- as.data.frame(test.conv)[1,]

以及新的predict_function

代码语言:javascript
复制
p_function <- function(model, data) {
  mat <- as.matrix(data)
  mat <- array_reshape(mat, c(nrow(data), ncol(data), 1))
  predict(model, mat, type = "prob")
}

两行新行将把data.frame转换成合适的数组。

然后行

代码语言:javascript
复制
ive_cnn <- individual_variable_effect(x = model.CNN, data = shapper_data, new_observation = shapper_new_obs, predict_function = p_function)

对我来说完全没问题。

最佳Szymon

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59724406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档