3 способа легко визуализировать модели машинного обучения кераса

3 способа легко визуализировать модели машинного обучения кераса

10 августа 2025 г.

Какие инструменты я могу использовать для визуализации моделей Keras?

Старый клише «Картинка стоит тысячи слов» может быть еще более правдой при работе со сложными моделями машинного обучения. Если вы не благословлены фотографической памятью, вы можете быстро потерять отслеживание архитектуры модели при простой чтении кода.

К счастью, есть несколько простых способов визуализации моделей машинного обучения. Это руководство фокусируется на визуализации моделей Keras и использует следующую модель («Тестовая модель») для демонстрации:

def build_model(pad_len, imu_dim, tof_dim, n_classes):
   def time_sum(x):
      return K.sum(x, axis=1)

   def squeeze_last_axis(x):
      return tf.squeeze(x, axis=-1)

   def expand_last_axis(x):
      return tf.expand_dims(x, axis=-1)    
    
   filters_l1 = 64
   kernel_l1 = 3
   filters_l2 = 128
   kernel_l2 = 5
   reduction = 8
   pool_size = 2
   drop = 0.3
   wd = 1e-4
    
   inp = Input(shape=(pad_len, imu_dim + tof_dim))
   imu = Lambda(lambda t: t[:, :, :imu_dim])(inp)
   tof = Lambda(lambda t: t[:, :, imu_dim:])(inp)

   # First CNN branch
   shortcut_1 = imu
   x1 = Conv1D(filters_l1, kernel_l1, padding="same", use_bias=False, kernel_regularizer=l2(wd))(imu)
   x1 = BatchNormalization()(x1)
   x1 = Activation("relu")(x1)
   x1 = Conv1D(filters_l1, kernel_l1, padding="same", use_bias=False, kernel_regularizer=l2(wd))(x1)
   x1 = BatchNormalization()(x1)
   x1 = Activation("relu")(x1)

   ch = x1.shape[-1]
   se = GlobalAveragePooling1D()(x1)
   se = Dense(ch//reduction, activation="relu")(se)
   se = Dense(ch, activation="sigmoid")(se)
   se = Reshape((1, ch))(se)
   x1 = Multiply()([x1, se])

   if shortcut_1.shape[-1] != filters_l1:
      shortcut_1 = Conv1D(filters_l1, 1, padding="same", use_bias=False, kernel_regularizer=l2(wd))(shortcut_1)
      shortcut_1 = BatchNormalization()(shortcut_1)
    
   x1 = add([x1, shortcut_1])
   x1 = Activation("relu")(x1)
   x1 = MaxPooling1D(pool_size)(x1)
   x1 = Dropout(drop)(x1)

   shortcut_2 = x1
   x1 = Conv1D(filters_l2, kernel_l2, padding="same", use_bias=False, kernel_regularizer=l2(wd))(x1)
   x1 = BatchNormalization()(x1)
   x1 = Activation("relu")(x1)
   x1 = Conv1D(filters_l2, kernel_l2, padding="same", use_bias=False, kernel_regularizer=l2(wd))(x1)
   x1 = BatchNormalization()(x1)
   x1 = Activation("relu")(x1)

   ch = x1.shape[-1]
   se = GlobalAveragePooling1D()(x1)
   se = Dense(ch//reduction, activation="relu")(se)
   se = Dense(ch, activation="sigmoid")(se)
   se = Reshape((1, ch))(se)
   x1 = Multiply()([x1, se])

   if shortcut_2.shape[-1] != filters_l2:
      shortcut_2 = Conv1D(filters_l2, 1, padding="same", use_bias=False, kernel_regularizer=l2(wd))(shortcut_2)
      shortcut_2 = BatchNormalization()(shortcut_2)

   x1 = add([x1, shortcut_2])
   x1 = Activation("relu")(x1)
   x1 = MaxPooling1D(pool_size)(x1)
   x1 = Dropout(drop)(x1)
    
   # Second CNN branch
   x2 = Conv1D(filters_l1, kernel_l1, padding="same", use_bias=False, kernel_regularizer=l2(wd))(tof)
   x2 = BatchNormalization()(x2)
   x2 = Activation("relu")(x2)
   x2 = MaxPooling1D(2)(x2)
   x2 = Dropout(0.2)(x2)
   x2 = Conv1D(filters_l2, kernel_l1, padding="same", use_bias=False, kernel_regularizer=l2(wd))(x2)
   x2 = BatchNormalization()(x2)
   x2 = Activation("relu")(x2)
   x2 = MaxPooling1D(2)(x2)
   x2 = Dropout(0.2)(x2)    

   merged = Concatenate()([x1, x2])

   xa = Bidirectional(LSTM(128, return_sequences=True, kernel_regularizer=l2(wd)))(merged)
   xb = Bidirectional(GRU(128, return_sequences=True, kernel_regularizer=l2(wd)))(merged)
   xc = GaussianNoise(0.09)(merged)
   xc = Dense(16, activation="elu")(xc)

   x = Concatenate()([xa, xb, xc])
   x = Dropout(0.4)(x)
   score = Dense(1, activation="tanh")(x)
   score = Lambda(squeeze_last_axis)(score)
   weights = Activation("softmax")(score)
   weights = Lambda(expand_last_axis)(weights)
   context = Multiply()([x, weights])
   x = Lambda(time_sum)(context)

   x = Dense(256, use_bias=False, kernel_regularizer=l2(wd))(x)
   x = BatchNormalization()(x)
   x = Activation("relu")(x)
   x = Dropout(0.5)(x)

   x = Dense(128, use_bias=False, kernel_regularizer=l2(wd))(x)
   x = BatchNormalization()(x)
   x = Activation("relu")(x)
   x = Dropout(0.3)(x)

   out = Dense(n_classes, activation="softmax", kernel_regularizer=l2(wd))(x)
   return Model(inp, out)

Как видите, приведенная выше модель достаточно сложна. Он используется для изучения паттернов из межтегенной измерения («IMU») и других данных датчиков. Чтобы быть ясным, я не строил это. Это ссылается из этогоЗаписная книжка KaggleПолем Как вы заметите, определение модели в исходной ноутбуке использует пользовательские объекты для инкапсуляции определенной логики, которая повторяется в дизайне модели. Я решил удалить эти объекты и явность определить логику «встроенная», чтобы лучше просмотреть полную структуру модели в моей слегка измененной реализации.

В этом руководстве обсуждается следующие 3 инструмента визуализации:

  1. Netron

  2. АVisualkerasПакет Python

  3. Тенсорборд

1. Использование Netron для визуализации модели кераса

NetronВозможно, самый простой инструмент визуализации. Вам просто нужно нажать наОткрытая модель ...Кнопка на домашней странице, а затем выберите модель, которую вы хотите визуализировать. Вот визуализация первых нескольких слоев тестовой модели:

Partial visualization of test model using Netron

Как только модель загружена, вы можете нажать на узлы на графике модели, чтобы просмотреть их свойства:

Node properties using Netron

Вы можете экспортировать график модели в.pngи.svgФорматы, нажав на значок главного меню и выбрав соответствующую опцию экспорта.

2. ИспользованиеvisualkerasЧтобы визуализировать свою модель кераса

АvisualkerasПакет Python также очень прост в использовании и предлагает удобный способ визуализации модели перед тренировкой. Вы можете установить пакет для своего проекта машинного обучения, используяpip:

pip install visualkeras

Следующий код Python демонстрирует базовое использование пакета:

# [Imports for your Keras model here...]
import visualkeras

# [Utility function to build your Keras model...]
def build_model(model_params):
   # [Your model definition here...]

# [Build the model...]
model = build_model(model_params)

# [Visualize the model...]
visualkeras.graph_view(model).show()

Аgraph_viewМетод создает следующую графику первых нескольких слоев тестовой модели:

Partial visualization of test model using `visualkeras.graph_view()` method

Пакет также предлагаетlayered_viewМетод, который создает графику модельных слоев, отличающихся типом и размером:

visualkeras.layered_view(model, legend=True).show()

Visualization of test model using `visualkeras.layered_view()` method

Как видно, прохождениеTrueвlegendПараметр генерирует легенду, описывающую каждый слой:

Layered view legend for test model

Одно преимуществоvisualkerasПакет - это элемент управления, который он предлагает, как отображается графика. Вы можете просмотреть параметры, используемые для изменения графического вывода наДокументация пакетастраница.

3. ИспользованиеТенсорбордЧтобы визуализировать модель кераса

Тенсорбордявляется удобным вариантом для визуализации модели кераса, поскольку она установлена вместе сTensorflowПолем С небольшим «массаж» также можно использоватьТенсорбордВизуализировать структуру модели перед тренировкой.

3.1 Установкаjupyter-tensorboardУпаковка

В этом разделе используетсяТенсорбордВ контекстеЖюрит -тетрадьПолем Это требует установкиjupyter-tensorboardПакет, который, в свою очередь, имеет пару зависимостей. Используйте следующие шаги для установкиjupyter-tensorboard:

  1. Установитьjupyterпакет с использованиемpip install jupyerПолем

  2. Используйтеpip install --upgrade notebook==6.4.12командоватьпонижатьаnotebookпакет, который был установлен сjupyterПроцесс установки упаковки. ВерсияnotebookПакет установлен сjupyterкоторый есть7.4.5На момент написания этой статьи не совместимо сjupyter-tensorboardПолем Этот этап понижения устанавливает версиюnotebookпакет, который совместим сjupyter-tensorboardПолем Смотрите этоСтатья StackoverflowДля получения дополнительной информации.

  3. Установитьjupyter-tensorboardпакет с использованиемpip install jupyter-tensorboardПолем

3.2 Настройка ноутбука Jupyter для визуализации модели кераса

Как упомянуто выше, вы можете визуализировать модель кераса вТенсорбордПеред тренировкой. Следующий код ноутбука Jupyter демонстрирует, как это сделать, используя тестовую модель из вступительного раздела:

# Cell 1: Imports
import tensorflow as tf
from tensorflow.keras.models import Model, load_model
from tensorflow.keras.layers import (
   Input, Conv1D, BatchNormalization, Activation, add, MaxPooling1D, Dropout,
   Bidirectional, LSTM, GlobalAveragePooling1D, Dense, Multiply, Reshape,
   Lambda, Concatenate, GRU, GaussianNoise
)
from tensorflow.keras.regularizers import l2
from tensorflow.keras import backend as K

# Cell 2: Set logs directory
LOG_DIR = "logs"

# Cell 3: Utility function to build model
# [`build-model` function for test model from introductory section here...]

# Cell 4: Build the model
model = build_model(398, 12, 335, 18)

# Cell 5: Compile the model
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])

# Cell 6: Create a TensorBoard callback
tensorboard_callback = tf.keras.callbacks.TensorBoard(
   log_dir=LOG_DIR,
   histogram_freq=1,
   write_graph=True,
   profile_batch=0 # Disable profiling
)

# Cell 7: Create dummy `x` and `y` training inputs that match model input and output shapes
dummy_x_input = tf.random.normal((1, 398, 347)) # Batch size 1, input shape (398,347)
dummy_y_input = tf.random.normal((1, 18)) # Batch size 1, input shape (18, )

# Cell 8: "Train" the model for zero epochs to create a conceptual graph of the model
model.fit(dummy_x_input, dummy_y_input, epochs=0, batch_size=1, callbacks=[tensorboard_callback])

# Cell 9: Load the TensorBoard notebook extension
%load_ext tensorboard

# Cell 10: Launch TensorBoard
%tensorboard --logdir $LOG_DIR --host localhost

Если вы запускаете код ноутбука Jupyter, выше, последняя ячейка должна вывестиLaunching TensorBoardПолем После завершения выполнения ячейки вы можете перейти кhttp://localhost:6006Чтобы просмотретьТенсорбордприборная панель.

Вы можете изменить порт тензорборда, передав--portвариант на%tensorboardВолшебная команда, например,%tensorboard --logdir $LOG_DIR --host localhost --port 8088Полем

Кончик:Я работаю в Windows 10, где я отметил какое -то любопытное поведение в отношении тензора. Чтобы заставить Tensorboard запускать правильно каждый раз, когда я запускаю ноутбук Jupyter, мне нужно сначала удалять все временные файлы вC:\Users\[MY_WINDOWS_USERNAME]\AppData\Local\Temp\.tensorboard-infoкаталог.

3.3 Визуализация модели кераса с помощью Tensorboard

Tensorboard должен автоматически открываться дляГрафикиприборная панель. Если это не так, вы можете нажать наГрафикиопция меню или вы можете выбратьГрафикииз выпадающего меню.

TensorBoard menu

ИзГрафикиПросмотреть, выберитеКонцептуальный графикЧтобы просмотреть структуру вашей модели. Первоначально вы должны увидеть один узел, представляющий всю модель. Дважды щелкните узел, чтобы увидеть структуру подсгласти.

Partial visualization of test model using TensorBoard

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

Заключение

Каждый метод визуализации, обсуждаемый выше, имеет свои плюсы и минусы. Netron чрезвычайно прост в использовании с обученными моделями, тогда какvisualkerasВозможно, самый простой инструмент для использования с неподготовленными моделями. Как видно, Tensorboard также может использоваться с неподготовленными моделями, но для правильной настройки требуется немного больше работы.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE