Shap: keras is no longer supported, please use tf.keras instead.

Created on 3 Mar 2020  路  3Comments  路  Source: slundberg/shap

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)?

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:

'''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])

All 3 comments

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!
Was this page helpful?
0 / 5 - 0 ratings

Related issues

gabrielcs picture gabrielcs  路  3Comments

resdntalien picture resdntalien  路  3Comments

samupino picture samupino  路  3Comments

TdoubleG picture TdoubleG  路  4Comments

yolle103 picture yolle103  路  3Comments