Calculating saliency maps for text classificationhow to propagate error from convolutional layer to previous layer?Steps for back propagation of convolutional layer in CNNHow to user Keras's Embedding Layer properly?Keras intermediate layer (attention model) outputHow to propagate error back to previous layer in CNN?How to do give input to CNN when doing a text processing?Keras CNN image input and outputFully connected layer output explodes, but weights, gradients, and inputs all have sane valuesVisualizing word embeddingsLoss and Regularization inference
My adviser wants to be the first author
Violin - Can double stops be played when the strings are not next to each other?
Shortcut for setting origin to vertex
Is it normal that my co-workers at a fitness company criticize my food choices?
Instead of a Universal Basic Income program, why not implement a "Universal Basic Needs" program?
How to terminate ping <dest> &
How do I change two letters closest to a string and one letter immediately after a string using Notepad++?
Why is the President allowed to veto a cancellation of emergency powers?
Is it true that good novels will automatically sell themselves on Amazon (and so on) and there is no need for one to waste time promoting?
PTIJ: Who should I vote for? (21st Knesset Edition)
Why did it take so long to abandon sail after steamships were demonstrated?
This word with a lot of past tenses
et qui - how do you really understand that kind of phraseology?
Life insurance that covers only simultaneous/dual deaths
Employee lack of ownership
Python if-else code style for reduced code for rounding floats
How difficult is it to simply disable/disengage the MCAS on Boeing 737 Max 8 & 9 Aircraft?
What is the significance behind "40 days" that often appears in the Bible?
Can I use USB data pins as power source
What are substitutions for coconut in curry?
Recruiter wants very extensive technical details about all of my previous work
What is "focus distance lower/upper" and how is it different from depth of field?
Are Roman Catholic priests ever addressed as pastor
Is honey really a supersaturated solution? Does heating to un-crystalize redissolve it or melt it?
Calculating saliency maps for text classification
how to propagate error from convolutional layer to previous layer?Steps for back propagation of convolutional layer in CNNHow to user Keras's Embedding Layer properly?Keras intermediate layer (attention model) outputHow to propagate error back to previous layer in CNN?How to do give input to CNN when doing a text processing?Keras CNN image input and outputFully connected layer output explodes, but weights, gradients, and inputs all have sane valuesVisualizing word embeddingsLoss and Regularization inference
$begingroup$
I'm following the text classification with movie reviews TensorFlow tutorial, and wanted to extend the project by looking, for a certain input, which words influenced the classification the most.
I understand this is called a saliency map, but I'm having trouble calculating it. I believe that I need to calculate the gradients of the output with respect to the input. I tried to implement code similar to the code in this answer to no avail. A confounding issue is that the model uses an embedding layer, which doesn't propagate the gradient, so I think one needs to calculate the gradients with the input being the output of the embedding layer.
It's probably wrong for all sorts of reasons, but this is the closest I've gotten with the Python code:
# Create the saliency function
input_tensors = [model.layers[1].input, keras.backend.learning_phase()]
model_input = model.layers[1].input
model_output = model.output
gradients = model.optimizer.get_gradients(model_output, model_input)
compute_gradients = keras.backend.function(inputs=input_tensors, outputs=gradients)
# Word encoding
idx = 0 # Calculate the saliency for the first training example
embeddings = model.layers[0].get_weights()[0]
embedded_training_data = embeddings[train_data[idx]]
matrix = compute_gradients([embedded_training_data.reshape(sum([(1,), embedded_training_data.shape], ())), train_labels[idx]])
But the final matrix is the same row repeated and I'm not sure how to interpret it. Any help would be greatly appreciated. Thankfully, as this is extending a tutorial, there is a complete working example of the code!
machine-learning python deep-learning tensorflow
$endgroup$
bumped to the homepage by Community♦ yesterday
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
$begingroup$
I'm following the text classification with movie reviews TensorFlow tutorial, and wanted to extend the project by looking, for a certain input, which words influenced the classification the most.
I understand this is called a saliency map, but I'm having trouble calculating it. I believe that I need to calculate the gradients of the output with respect to the input. I tried to implement code similar to the code in this answer to no avail. A confounding issue is that the model uses an embedding layer, which doesn't propagate the gradient, so I think one needs to calculate the gradients with the input being the output of the embedding layer.
It's probably wrong for all sorts of reasons, but this is the closest I've gotten with the Python code:
# Create the saliency function
input_tensors = [model.layers[1].input, keras.backend.learning_phase()]
model_input = model.layers[1].input
model_output = model.output
gradients = model.optimizer.get_gradients(model_output, model_input)
compute_gradients = keras.backend.function(inputs=input_tensors, outputs=gradients)
# Word encoding
idx = 0 # Calculate the saliency for the first training example
embeddings = model.layers[0].get_weights()[0]
embedded_training_data = embeddings[train_data[idx]]
matrix = compute_gradients([embedded_training_data.reshape(sum([(1,), embedded_training_data.shape], ())), train_labels[idx]])
But the final matrix is the same row repeated and I'm not sure how to interpret it. Any help would be greatly appreciated. Thankfully, as this is extending a tutorial, there is a complete working example of the code!
machine-learning python deep-learning tensorflow
$endgroup$
bumped to the homepage by Community♦ yesterday
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
$begingroup$
I'm following the text classification with movie reviews TensorFlow tutorial, and wanted to extend the project by looking, for a certain input, which words influenced the classification the most.
I understand this is called a saliency map, but I'm having trouble calculating it. I believe that I need to calculate the gradients of the output with respect to the input. I tried to implement code similar to the code in this answer to no avail. A confounding issue is that the model uses an embedding layer, which doesn't propagate the gradient, so I think one needs to calculate the gradients with the input being the output of the embedding layer.
It's probably wrong for all sorts of reasons, but this is the closest I've gotten with the Python code:
# Create the saliency function
input_tensors = [model.layers[1].input, keras.backend.learning_phase()]
model_input = model.layers[1].input
model_output = model.output
gradients = model.optimizer.get_gradients(model_output, model_input)
compute_gradients = keras.backend.function(inputs=input_tensors, outputs=gradients)
# Word encoding
idx = 0 # Calculate the saliency for the first training example
embeddings = model.layers[0].get_weights()[0]
embedded_training_data = embeddings[train_data[idx]]
matrix = compute_gradients([embedded_training_data.reshape(sum([(1,), embedded_training_data.shape], ())), train_labels[idx]])
But the final matrix is the same row repeated and I'm not sure how to interpret it. Any help would be greatly appreciated. Thankfully, as this is extending a tutorial, there is a complete working example of the code!
machine-learning python deep-learning tensorflow
$endgroup$
I'm following the text classification with movie reviews TensorFlow tutorial, and wanted to extend the project by looking, for a certain input, which words influenced the classification the most.
I understand this is called a saliency map, but I'm having trouble calculating it. I believe that I need to calculate the gradients of the output with respect to the input. I tried to implement code similar to the code in this answer to no avail. A confounding issue is that the model uses an embedding layer, which doesn't propagate the gradient, so I think one needs to calculate the gradients with the input being the output of the embedding layer.
It's probably wrong for all sorts of reasons, but this is the closest I've gotten with the Python code:
# Create the saliency function
input_tensors = [model.layers[1].input, keras.backend.learning_phase()]
model_input = model.layers[1].input
model_output = model.output
gradients = model.optimizer.get_gradients(model_output, model_input)
compute_gradients = keras.backend.function(inputs=input_tensors, outputs=gradients)
# Word encoding
idx = 0 # Calculate the saliency for the first training example
embeddings = model.layers[0].get_weights()[0]
embedded_training_data = embeddings[train_data[idx]]
matrix = compute_gradients([embedded_training_data.reshape(sum([(1,), embedded_training_data.shape], ())), train_labels[idx]])
But the final matrix is the same row repeated and I'm not sure how to interpret it. Any help would be greatly appreciated. Thankfully, as this is extending a tutorial, there is a complete working example of the code!
machine-learning python deep-learning tensorflow
machine-learning python deep-learning tensorflow
asked Feb 8 at 17:36
Marc JonesMarc Jones
112
112
bumped to the homepage by Community♦ yesterday
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
bumped to the homepage by Community♦ yesterday
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
I've been working on this for the last few days, and I think I've answered my own question. Calculating individual word saliency is not possible with the model structure as is. This is because of the GlobalAveragePooling layer of the model. This averages the embedding matrix in the 'word' dimension, removing the ability to distinguish the effect of an individual word on the classification. This is the code I used to convince myself of what was happening, left here in the hope that the next soul to try this finds this answer.
outputTensor = model.output
embeddingTensor = model.layers[1].input
gradientsEmbedding = tf.gradients(outputTensor, embeddingTensor)
globalAverageTensor = model.layers[2].input
gradientsAverage = tf.gradients(outputTensor, globalAverageTensor)
idx = 1
sess = keras.backend.get_session()
embedding = sess.run(embeddingTensor, feed_dict=model.input:train_data[(idx-1):idx,:])
globalAverage = sess.run(model.layers[2].input, feed_dict=model.input:train_data[(idx-1):idx,:])
print(np.mean(embedding, 1))
print(globalAverage)
gradientMatrixEmbedding = sess.run(gradientsEmbedding, feed_dict=embeddingTensor:embedding)
gradientMatrixAverage = sess.run(gradientsAverage, feed_dict=globalAverageTensor:globalAverage)
print(np.sum(gradientMatrixEmbedding, 2))
print(gradientMatrixAverage)
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
);
);
, "mathjax-editing");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "557"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdatascience.stackexchange.com%2fquestions%2f45276%2fcalculating-saliency-maps-for-text-classification%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
I've been working on this for the last few days, and I think I've answered my own question. Calculating individual word saliency is not possible with the model structure as is. This is because of the GlobalAveragePooling layer of the model. This averages the embedding matrix in the 'word' dimension, removing the ability to distinguish the effect of an individual word on the classification. This is the code I used to convince myself of what was happening, left here in the hope that the next soul to try this finds this answer.
outputTensor = model.output
embeddingTensor = model.layers[1].input
gradientsEmbedding = tf.gradients(outputTensor, embeddingTensor)
globalAverageTensor = model.layers[2].input
gradientsAverage = tf.gradients(outputTensor, globalAverageTensor)
idx = 1
sess = keras.backend.get_session()
embedding = sess.run(embeddingTensor, feed_dict=model.input:train_data[(idx-1):idx,:])
globalAverage = sess.run(model.layers[2].input, feed_dict=model.input:train_data[(idx-1):idx,:])
print(np.mean(embedding, 1))
print(globalAverage)
gradientMatrixEmbedding = sess.run(gradientsEmbedding, feed_dict=embeddingTensor:embedding)
gradientMatrixAverage = sess.run(gradientsAverage, feed_dict=globalAverageTensor:globalAverage)
print(np.sum(gradientMatrixEmbedding, 2))
print(gradientMatrixAverage)
$endgroup$
add a comment |
$begingroup$
I've been working on this for the last few days, and I think I've answered my own question. Calculating individual word saliency is not possible with the model structure as is. This is because of the GlobalAveragePooling layer of the model. This averages the embedding matrix in the 'word' dimension, removing the ability to distinguish the effect of an individual word on the classification. This is the code I used to convince myself of what was happening, left here in the hope that the next soul to try this finds this answer.
outputTensor = model.output
embeddingTensor = model.layers[1].input
gradientsEmbedding = tf.gradients(outputTensor, embeddingTensor)
globalAverageTensor = model.layers[2].input
gradientsAverage = tf.gradients(outputTensor, globalAverageTensor)
idx = 1
sess = keras.backend.get_session()
embedding = sess.run(embeddingTensor, feed_dict=model.input:train_data[(idx-1):idx,:])
globalAverage = sess.run(model.layers[2].input, feed_dict=model.input:train_data[(idx-1):idx,:])
print(np.mean(embedding, 1))
print(globalAverage)
gradientMatrixEmbedding = sess.run(gradientsEmbedding, feed_dict=embeddingTensor:embedding)
gradientMatrixAverage = sess.run(gradientsAverage, feed_dict=globalAverageTensor:globalAverage)
print(np.sum(gradientMatrixEmbedding, 2))
print(gradientMatrixAverage)
$endgroup$
add a comment |
$begingroup$
I've been working on this for the last few days, and I think I've answered my own question. Calculating individual word saliency is not possible with the model structure as is. This is because of the GlobalAveragePooling layer of the model. This averages the embedding matrix in the 'word' dimension, removing the ability to distinguish the effect of an individual word on the classification. This is the code I used to convince myself of what was happening, left here in the hope that the next soul to try this finds this answer.
outputTensor = model.output
embeddingTensor = model.layers[1].input
gradientsEmbedding = tf.gradients(outputTensor, embeddingTensor)
globalAverageTensor = model.layers[2].input
gradientsAverage = tf.gradients(outputTensor, globalAverageTensor)
idx = 1
sess = keras.backend.get_session()
embedding = sess.run(embeddingTensor, feed_dict=model.input:train_data[(idx-1):idx,:])
globalAverage = sess.run(model.layers[2].input, feed_dict=model.input:train_data[(idx-1):idx,:])
print(np.mean(embedding, 1))
print(globalAverage)
gradientMatrixEmbedding = sess.run(gradientsEmbedding, feed_dict=embeddingTensor:embedding)
gradientMatrixAverage = sess.run(gradientsAverage, feed_dict=globalAverageTensor:globalAverage)
print(np.sum(gradientMatrixEmbedding, 2))
print(gradientMatrixAverage)
$endgroup$
I've been working on this for the last few days, and I think I've answered my own question. Calculating individual word saliency is not possible with the model structure as is. This is because of the GlobalAveragePooling layer of the model. This averages the embedding matrix in the 'word' dimension, removing the ability to distinguish the effect of an individual word on the classification. This is the code I used to convince myself of what was happening, left here in the hope that the next soul to try this finds this answer.
outputTensor = model.output
embeddingTensor = model.layers[1].input
gradientsEmbedding = tf.gradients(outputTensor, embeddingTensor)
globalAverageTensor = model.layers[2].input
gradientsAverage = tf.gradients(outputTensor, globalAverageTensor)
idx = 1
sess = keras.backend.get_session()
embedding = sess.run(embeddingTensor, feed_dict=model.input:train_data[(idx-1):idx,:])
globalAverage = sess.run(model.layers[2].input, feed_dict=model.input:train_data[(idx-1):idx,:])
print(np.mean(embedding, 1))
print(globalAverage)
gradientMatrixEmbedding = sess.run(gradientsEmbedding, feed_dict=embeddingTensor:embedding)
gradientMatrixAverage = sess.run(gradientsAverage, feed_dict=globalAverageTensor:globalAverage)
print(np.sum(gradientMatrixEmbedding, 2))
print(gradientMatrixAverage)
edited Feb 13 at 12:16
answered Feb 12 at 15:35
Marc JonesMarc Jones
112
112
add a comment |
add a comment |
Thanks for contributing an answer to Data Science Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdatascience.stackexchange.com%2fquestions%2f45276%2fcalculating-saliency-maps-for-text-classification%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown