#python #tensorflow #machine-learning #conv-neural-network #tensorflow-lite
Вопрос:
Я пытаюсь создать визуализацию тепловой карты (Grad-CAM) для скомпилированной модели tensorflow lite. Для этой задачи я хотел бы знать, как вычислить градиенты и создать тепловые карты для визуализации активации класса, используя модель tensorflow lite вместо модели tensorflow.
import argparse
from PIL import Image
from pycoral.adapters import classify
from pycoral.adapters import common
from pycoral.utils.dataset import read_label_file
from pycoral.utils.edgetpu import make_interpreter
import numpy as np
def main():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-m', '--model', required=True, help='File path of .tflite file.')
parser.add_argument('-i', '--input', required=True, help='Image to be classified.')
parser.add_argument('-l', '--labels', required=True, help='File path of labels file.')
parser.add_argument('-k', '--top_k', type=int, default=1, help='Max number of classification results')
args = parser.parse_args()
labels = read_label_file(args.labels) if args.labels else {}
interpreter = make_interpreter(*args.model.split('@'))
interpreter.allocate_tensors()
size = common.input_size(interpreter)
image = Image.open(args.input).convert('RGB').resize(size, Image.ANTIALIAS)
common.set_input(interpreter, image)
output_data = interpreter.get_tensor(output_details[0]['index'])
#loads the weights of the compiled model.
for _ in range(args.count):
interpreter.invoke()
classes = classify.get_classes(interpreter, args.top_k, args.threshold)
for c in classes:
print('%s: %.5f' % (labels.get(c.id, c.id), c.score))
Следуя моему коду выше, он выводит класс изображения и печатает веса. Однако, насколько я понимаю, мне нужно будет создать новую модель тензорного потока, используя входные данные, выходные данные последнего сверточного слоя и выходные данные модели. Затем вычислите градиент для вывода последнего сверточного слоя для этой новой модели тензорного потока и вычислите среднюю интенсивность каждого градиента. Наконец, мне пришлось бы умножить каждый канал объединенных оценок, полученных на последнем шаге
Я использую в качестве основы для тепловой карты эту градусную камеру:
def make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None):
grad_model = tf.keras.models.Model(
[model.inputs], [model.get_layer(last_conv_layer_name).output, model.output]
)
with tf.GradientTape() as tape:
last_conv_layer_output, preds = grad_model(img_array)
if pred_index is None:
pred_index = tf.argmax(preds[0])
class_channel = preds[:, pred_index]
grads = tape.gradient(class_channel, last_conv_layer_output)
pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
last_conv_layer_output = last_conv_layer_output[0]
heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
heatmap = tf.squeeze(heatmap)
heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
return heatmap.numpy()
Я довольно новичок в TensorFlow lite и все еще пытаюсь приложить руку к серверной части TensorFlow. Чего я пытаюсь добиться, так это перевести функцию grad-cam для Tensorflow в Tensorflow Lite. Я использую библиотеку PyCoral, но это можно сделать и на Tensorflow Lite. Я не смог понять, как выполнять соответствующие операции из Tensorflow в TFlite.
Комментарии:
1. Вы не можете вычислять градиенты с помощью модели TF Lite, эта функция недоступна. В лучшем случае вы можете попробовать использовать модель Keras.
2. действительно? существует ли какая-либо альтернатива объяснимости ИИ для моделей TF Lite?