DeepDanbooru/DeepDanbooru/deepdanbooru/gradcam.py

49 lines
1.3 KiB
Python

import tensorflow as tf
import numpy as np
# gpus = tf.config.experimental.list_physical_devices('GPU')
# if gpus:
# try:
# for gpu in gpus:
# tf.config.experimental.set_memory_growth(gpu, True)
# except RuntimeError as e:
# print(e)
def grad(y, x):
V = tf.keras.layers.Lambda(lambda z: tf.gradients(
z[0], z[1]), output_shape=[1])([y, x])
return V
def grad_cam_test(model, x, some_variable):
fixed_input = model.inputs
fixed_output = tf.keras.layers.Lambda(lambda z: tf.keras.backend.gradients(
z[0], z[1]), output_shape=[2])([model.inputs[0], model.outputs[0]])
grad_model = tf.keras.Model(inputs=fixed_input, outputs=fixed_output)
return grad_model.predict(x)
def run_test():
# Generate sample model
x = tf.keras.Input(shape=(2))
y = tf.keras.layers.Dense(2)(x)
model = tf.keras.Model(inputs=x, outputs=y)
target = np.array([[1.0, 2.0]], dtype=np.float32)
# Calculate gradient using numpy array
input_numpy = np.array([[0.0, 0.0]])
grad_output_numpy = grad_cam_test(model, input_numpy, target)
print(f'numpy: {grad_output_numpy}')
# Calculate gradient using tf.Variable
input_variable = tf.constant([[0.0, 0.0]])
grad_output_variable = grad_cam_test(model, input_variable, target)
print(f'variable: {grad_output_variable}')
run_test()