Skip to content

Instantly share code, notes, and snippets.

View hanneshapke's full-sized avatar

Hannes Hapke hanneshapke

View GitHub Profile
@hanneshapke
hanneshapke / model.py
Last active April 16, 2018 02:42
Model definition for the CNN Visualization Demo
sequence_input = Input(shape=(maxlen_text,))
x = Embedding(name='embedding_layer',
input_dim=max_words_to_keep,
output_dim=token_vec_size,
input_length=maxlen_text)(sequence_input)
x = Dropout(.20)(x)
x = Conv1D(64, 5, activation='relu', name='1-conv1d', padding='same')(x)
x = MaxPooling1D(pool_size=4)(x)
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@hanneshapke
hanneshapke / extract_layer.py
Last active April 16, 2018 02:42
Extract Keras layers by layer name
def get_conv_layer(model, layer_name):
conv_layer = model.get_layer(layer_name)
output_dim = conv_layer.output_shape[1]
return conv_layer, output_dim
@hanneshapke
hanneshapke / generate_layer_heat_map.py
Last active April 9, 2020 17:59
How to generate the layer heat map in Keras 2.1
def get_heatmap(model, layer_name, matrix, y_labels):
# obtain probability of the label with the highest certainty
network_output = model.get_output_at(0)[:, np.argmax(y_labels)]
# obtain the output vector and its dimension of the convolutional layer we want to visualize
conv_layer, layer_output_dim = get_conv_layer(model, layer_name)
# Setting up the calculation of the gradients between the output and the conv layer. Will be executed in the iteration step
grads = K.gradients(network_output, conv_layer.output)[0]
# average the gradients across our samples (one sample) and all filters
@hanneshapke
hanneshapke / norm_heatmap.py
Last active April 16, 2018 02:44
Normalize the visualization heat map
def norm_heatmap(heatmap):
# element-wise maximum calculation, basically setting all negative values to zero
heatmap = np.maximum(heatmap, 0)
# normalizing the heatmap to values between 0 and 1
norm_heatmap = heatmap / np.max(heatmap)
return norm_heatmap
@hanneshapke
hanneshapke / plot_heatmap.py
Last active April 16, 2018 02:44
Plot the layer heatmap
def plot_heatmap(heatmap, height_ratio=0.05):
# calculating how often the vector should be repeated to display a height relative to the vector length
repeat_vector_n_times = int(heatmap.shape[0] * height_ratio)
plt.matshow([heatmap] * repeat_vector_n_times)
@hanneshapke
hanneshapke / generate_text_tag.py
Created April 11, 2018 22:59
Generate the text tag with the color attribute
def cstr(s, color='black'):
return "<text style=\"color:{}\">{}</text>".format(color, s)
@hanneshapke
hanneshapke / generate_color_for_heatmap_value.py
Last active April 16, 2018 02:45
Generate text color depending on the heat-map value
def color(hvalue, threshold, max=1, cdefault='black', colors=['red', 'yellow', 'green', 'cyan', 'blue']):
num_colors = len(colors)
if hvalue < threshold:
return cdefault
for i, color in enumerate(colors):
if hvalue > (max - (max - threshold) / num_colors * (i + 1)):
return color
@hanneshapke
hanneshapke / get_token_indicies.py
Last active April 16, 2018 02:47
get_token_indicies
def get_token_indices(model, layer_name, threshold, matrix, y_labels):
heatmap = get_heatmap(model=model, layer_name=layer_name, matrix=matrix, y_labels=y_labels)
_, output_dim = get_conv_layer(model, layer_name)
# depending on the ration between the input and layer output shape, we need to calculate
# how many original tokens have contributed to the layer output
dim_ratio = matrix.shape[1] / output_dim
if dim_ratio < 1.5:
window_size = 1
else:
@hanneshapke
hanneshapke / get_highlighted_tokens.py
Last active April 16, 2018 02:46
get_highlighted_tokens
def get_highlighted_tokens(tokens, matrix, model, layer_name, threshold, y_labels):
indices = get_token_indices(model, layer_name, threshold, matrix, y_labels)
ctokens = []
for i, t in enumerate(tokens):
if i in indices.keys():
_color = color(indices[i], threshold=threshold)
ctokens.append(cstr(t, color=_color))
else:
ctokens.append(t)