TensorBoard Projector позволяет графически представлять низкоразмерные вложения. Здесь я покажу вам, как вместо отображения точки вы можете визуализировать изображение, к которому относится встраивание.

Встраивающий проектор TensorBoard - это очень мощный инструмент для анализа данных, особенно для интерпретации и визуализации встраиваемых изображений с низкой размерностью. Для этого, во-первых, он применяет алгоритм уменьшения размерности к входным вложениям между UMAP, T-SNE, PCA или пользовательским, чтобы уменьшить их размерность до трех и иметь возможность отображать их в трехмерном виде. космос.

После создания карты этот инструмент можно использовать, например, для поиска определенных ключевых слов, связанных с вложениями, или выделения похожих точек в пространстве. В конечном итоге его цель - предоставить способ лучше интерпретировать вложения, которые генерирует наша модель машинного обучения, чтобы проверить, нанесены ли аналогичные в соответствии с нашим определением рядом в трехмерном пространстве.

Когда вложения, которые мы хотим отобразить, происходят из слов, нанесения точек с помощью тега, на который он ссылается, более чем достаточно, что в точности соответствует варианту использования, представленному в документации TensorBoard.

Однако, если мы хотим проецировать вложения изображений, метка в этом случае не будет актуальной. С другой стороны, если вместо визуализации трехмерных точек мы отображаем изображения, это, безусловно, позволит нам проверить, нанесены ли рядом похожие изображения.

Это и есть цель этого урока.

Выполнение

Перед началом этого руководства предполагается, что у вас есть модель, разработанная на TensorFlow, и набор данных, содержащий пути изображений, используемых для обучения / тестирования модели. Проектирование вложения должно быть последним этапом.

Первым шагом в записной книжке Jupyter является загрузка TensorBoard и расширений, которые мы собираемся использовать.

%load_ext tensorboard
import csv
import numpy as np
import tensorflow as tf
from PIL import Image

Затем мы создадим вторую модель, которая будет иметь те же входные данные, что и наша исходная модель, но создаст низкоразмерное представление. Это зависит от архитектуры исходной модели. Как правило, вы можете использовать последний слой перед применением функции активации или слой перед последним, если размер вложения меньше.

embeddings = tf.keras.models.Model( 
    inputs=model.inputs, 
    outputs=model.layers[-1].output 
)

После создания нашего встроенного модуля нам нужно взять образец изображений, которые будут отображаться на проекторе TensorBoard. Причина в том, что этот инструмент работает в браузере и не может отображать большое количество изображений. Однако с выборкой от 1000 до 1500 изображений результаты уже обеспечат высокую интерпретируемость. В этом примере образец взят из проверочного набора.

def get_img(img_path):
    img = tf.io.read_file(img_path)
    # convert the compressed string to a 3D uint8 tensor
    img = tf.image.decode_jpeg(img, channels=3)
    # resize the image to the desired size for your model
    img = tf.image.resize_with_pad(img, 100, 100)
    return img
# Generate embeddings
images_pil = []
images_embeddings = []
labels = []
for x in raw_val_ds.take(1500): 
    img_path = x[0]
    img_tf = get_img(img_path)
    # Save both tf image for prediction and PIL image for sprite
    img_pil = Image.open(img_path.numpy()).resize((100, 100))
    img_embedding = embeddings(tf.expand_dims(img_tf, axis=0))
    images_embeddings.append(img_embedding.numpy()[0])
    images_pil.append(img_pil)
    # Assuming your output data is directly the label
    label = x[1] 
    labels.append(label)

Чтобы обеспечить встраивание в TensorBoard, нам нужно вывести feature_vecs.tsv внутри папки, из которой мы будем запускать TensorBoard.

with open(f’{LOG_DIR}/embeddings/feature_vecs.tsv’, ‘w’) as fw:
    csv_writer = csv.writer(fw, delimiter=’\t’)
    csv_writer.writerows(images_embeddings)

Наконец, мы сгенерируем спрайт или коллаж из наших изображений, чтобы TensorBoard позже мог визуализировать их индивидуально, обращая внимание на их вложения.

Примечание: изображения должны быть в том же порядке, что и вложения.

one_square_size = int(np.ceil(np.sqrt(len(images_embeddings))))
master_width = 100 * one_square_size
master_height = 100 * one_square_size
spriteimage = Image.new(
    mode=’RGBA’,
    size=(master_width, master_height),
    color=(0,0,0,0) # fully transparent
)
for count, image in enumerate(images_pil):
    div, mod = divmod(count, one_square_size)
    h_loc = 100 * div
    w_loc = 100 * mod
    spriteimage.paste(image, (w_loc, h_loc))
spriteimage.convert(“RGB”).save(f’{LOG_DIR}/embeddings/sprite.jpg’, transparency=0)

При желании мы также можем вывести metadata.tsv , чтобы связать вложение изображения с определенной меткой (и затем иметь возможность выполнять поиск по нему). Это может быть, например, категория изображения.

Опять же, метки должны быть в том же порядке, что и вложения.

with open(f’{LOG_DIR}/embeddings/metadata.tsv’, ‘w’) as file: 
    for label in labels:
        file.write(f”{label}\n”)

Результат

После того, как необходимые файлы были сгенерированы, нам просто нужно запустить TensorBoard для наших данных журнала. Это можно сделать, выполнив в ячейке:

%tensorboard — logdir LOG_DIR

Здесь вы можете увидеть ожидаемый результат при выборе вкладки Projector в TensorBoard.

Тестируйте различные алгоритмы уменьшения размерности, пока не получите удовлетворительную проекцию!

Выводы

В этом руководстве мы увидели, как использовать TensorBoard не только для представления встраиваемых слов, но и для встраивания изображений вместе с изображением, на которое они ссылаются. Это может обеспечить понимание интерпретируемости при анализе моделей глубокого обучения.

Если вы хотите найти больше подобных сообщений, вы можете найти меня по адресу: