while running example given on homepage of SHAP- "Deep learning example with DeepExplainer (TensorFlow/Keras models) " getting this error. Please suggest. ( is there no support for keras only and we have to use tensorflow's keras)?
When using Keras from TensorFlow (from tensorflow.keras import ...) then the warning is still present, but SHAP complains about something different afterwards, i.e., the softmax activation function of the MNIST example. When a sigmoid is used instead then the code runs and produces an image very similar to the example on the homepage (but still with the warning about keras not being supported).
Full working code for reference:
'''Trains a simple convnet on the MNIST dataset.
Gets to 99.25% test accuracy after 12 epochs
(there is still a lot of margin for parameter tuning).
16 seconds per epoch on a GRID K520 GPU.
'''
from __future__ import print_function
#import keras
#from keras.datasets import mnist
#from keras.models import Sequential
#from keras.layers import Dense, Dropout, Flatten
#from keras.layers import Conv2D, MaxPooling2D
#from keras import backend as K
### Note: all instances of keras.something in the code below
### changed to tf.keras.something
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras import backend as K
batch_size = 128
num_classes = 10
epochs = 1 # original: 12
# input image dimensions
img_rows, img_cols = 28, 28
# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
#y_train = keras.utils.to_categorical(y_train, num_classes)
#y_test = keras.utils.to_categorical(y_test, num_classes)
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
### Note the sigmoid here instead of softmax,
### resulting in slightly lower classifier accuracy ###
model.add(Dense(num_classes, activation='sigmoid'))
#model.compile(loss=keras.losses.categorical_crossentropy,
# optimizer=keras.optimizers.Adadelta(),
# metrics=['accuracy'])
model.compile(loss=tf.keras.losses.categorical_crossentropy,
optimizer=tf.keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
import shap
import numpy as np
background = x_train[np.random.choice(x_train.shape[0], 100, replace=False)]
e = shap.DeepExplainer(model, background)
shap_values = e.shap_values(x_test[1:5])
# plot the feature attributions
shap.image_plot(shap_values, -x_test[1:5])
Can't I use Keras directly( not from tensorflow) for SHAP deep explainer?
I can confirm the issue occurs with other keras models. Here is the full error text I get for one of my Keras 2.3.1 models:
keras is no longer supported, please use tf.keras instead.
Traceback (most recent call last):
File "./test_shap.py", line 159, in <module>
explainer = shap.DeepExplainer(model, train_data.X_train[:1000])
File "/usr/local/lib/python3.6/dist-packages/shap/explainers/deep/__init__.py", line 80, in __init__
self.explainer = TFDeepExplainer(model, data, session, learning_phase_flags)
File "/usr/local/lib/python3.6/dist-packages/shap/explainers/deep/deep_tf.py", line 96, in __init__
self.model_inputs = _get_model_inputs(model)
File "/usr/local/lib/python3.6/dist-packages/shap/explainers/tf_utils.py", line 66, in _get_model_inputs
assert False, str(type(model)) + " is not currently a supported model type!"
AssertionError: <class 'lib.keras_models.Binary_LSTM'> is not currently a supported model type!
Most helpful comment
When using Keras from TensorFlow (
from tensorflow.keras import ...) then the warning is still present, but SHAP complains about something different afterwards, i.e., the softmax activation function of the MNIST example. When a sigmoid is used instead then the code runs and produces an image very similar to the example on the homepage (but still with the warning about keras not being supported).Full working code for reference: