Невозможно использовать SHAP GradientExplainer из-за ошибки Tensorflow (тензоры не хешируются)

Я долгое время застрял в этой ошибке, и можно ли как-то решить ее, не понижая мою версию tensorflow? Все решения, которые я нашел до сих пор, рекомендовали использовать TF‹2.0, чего я не хочу делать. Текущая версия TF = 2.4.1, версия Keras = 2.4.3, использование google colab

Я пытаюсь использовать SHAP GradientExplainer с моделью VGG 16, чтобы увидеть, как конкретный слой влияет на прогнозы.

Код:

e = shap.GradientExplainer((model.layers[7].input, model.layers[-1].output), map2layer(preprocess_input(X.copy()), 7))
shap_values, indexes = e.shap_values(map2layer(to_predict, 7), ranked_outputs=2)
index_names = np.vectorize(lambda x: class_names[str(x)][1])(indexes)
index_names 

Ошибка:

TypeError                                 Traceback (most recent call last)
<ipython-input-13-b3a265bc3cde> in <module>()
----> 1 e = shap.GradientExplainer((model.layers[7].input, model.layers[-1].output), map2layer(preprocess_input(X.copy()), 7))
      2 shap_values, indexes = e.shap_values(map2layer(to_predict, 7), ranked_outputs=2)
      3 index_names = np.vectorize(lambda x: class_names[str(x)][1])(indexes)
      4 index_names


<ipython-input-11-f110beabf449> in map2layer(x, layer)
      1 def map2layer(x, layer):
----> 2     feed_dict = dict(zip([model.layers[0].input], [preprocess_input(x.copy())]))
      3     return K.get_session().run(model.layers[layer].input, feed_dict)

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/keras_tensor.py in __hash__(self)
    259   def __hash__(self):
    260     raise TypeError('Tensors are unhashable. (%s)'
--> 261                     'Instead, use tensor.ref() as the key.' % self)
    262 
    263   # Note: This enables the KerasTensor's overloaded "right" binary

TypeError: Tensors are unhashable. (KerasTensor(type_spec=TensorSpec(shape=(None, 224, 224, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"))Instead, use tensor.ref() as the key.

person AnaDesh    schedule 02.02.2021    source источник
comment
Можете ли вы показать больше трассировки стека?   -  person Kris    schedule 02.02.2021
comment
Спасибо. Возможно, его будет легче читать, если вы пропустите его в основном вопросе.   -  person Kris    schedule 02.02.2021


Ответы (1)


Похоже, вы вводите Tensor или KerasTensor в свой feed_dict. Python пытается хешировать ключи словаря (словарь Python — это хэш-карта), что вызывает ошибку, которую вы видите. Причина в том, что тензоры не хэшируются (это означает, что у них нет реализации метода __hash__).

Чтобы решить эту проблему, убедитесь, что ключи feed_dict являются заполнителями или объектами keras.Input.

person Kris    schedule 02.02.2021
comment
Извините, но я впервые использую VGG или занимаюсь обработкой изображений, как мне проверить, что ключи feed_dict являются объектами keras.Input, и если они не являются, как мне преобразовать их в этот тип? - person AnaDesh; 02.02.2021
comment
Просто осмотрите объект feed_dict, который вы создаете. Возможно, решение состоит в том, чтобы следовать предложению в сообщении об ошибке, то есть использовать tensor.ref() в качестве ключа. - person Kris; 02.02.2021
comment
Лично я давно не использовал tensorflow/keras, так что могу ошибаться - person Kris; 02.02.2021