Нейронные сети — мощный инструмент машинного обучения, но их сложно понять и визуализировать. К счастью, есть инструменты, облегчающие эту задачу. Одним из таких инструментов является VisualKeras, библиотека Python, которая позволяет интуитивно создавать и визуализировать нейронные сети. В этом блоге мы рассмотрим, как использовать VisualKeras для визуализации нейронной сети.

Во-первых, нам нужно установить VisualKeras. Мы можем сделать это с помощью pip, менеджера пакетов Python. Откройте окно терминала и введите следующую команду:

pip install visualkeras

После установки VisualKeras мы можем начать использовать его для визуализации нашей нейронной сети. Начнем с создания простой нейронной сети с одним входным слоем, одним скрытым слоем и одним выходным слоем. Мы будем использовать модель Sequential из библиотеки Keras для создания этой сети. Вот код для создания модели:

from keras.models import Sequential
from keras.layers import Dense
from visualkeras import layered_view

# create the model
model = Sequential([
    Dense(64, activation='relu', input_shape=(784,)),
    Dense(10, activation='softmax')
])

# visualize the model
layered_view(model, legend=True)

В приведенном выше коде мы импортируем модель Sequential из Keras и слой Dense. Мы также импортируем функцию layered_view из VisualKeras. Затем мы создаем нашу нейронную сеть, используя модель Sequential, и добавляем плотный слой с 64 узлами, функцией активации ReLU и входной формой (784,). Затем мы добавляем еще один плотный слой с 10 узлами, функцией активации softmax и без указания входной формы.

Наконец, мы передаем нашу модель функции layered_view для ее визуализации. Эта функция создает схему нашей нейронной сети, где каждый слой представлен в виде прямоугольного блока. Размер каждого прямоугольника соответствует количеству узлов в этом слое. Цвет каждого поля указывает на тип слоя (зеленый для ввода, синий для скрытого и красный для вывода).

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

Теперь давайте попробуем создать более сложную нейронную сеть с несколькими скрытыми слоями. Вот код для создания этой сети:

from keras import layers, Model, backend
from visualkeras import layered_view

channel_axis = -1
def model():
    img_input = layers.Input(shape = (224, 224, 3))
    x = layers.Conv2D(32, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block1_conv1')(img_input)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block1_bn1')(x)
    x = layers.Activation('relu', name = 'block1_act1')(x)
    x = layers.Conv2D(32, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block1_conv2')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block1_bn2')(x)
    x = layers.Activation('relu', name = 'block1_act2')(x)
    x = layers.MaxPooling2D((2, 2),
                            strides=(2, 2),
                            padding='same',
                            name='block1_pool')(x)

    # block 2
    x = layers.Conv2D(64, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block2_conv1')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block2_bn1')(x)
    x = layers.Activation('relu', name = 'block2_act1')(x)
    x = layers.Conv2D(64, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block2_conv2')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block2_bn2')(x)
    x = layers.Activation('relu', name = 'block2_act2')(x)
    x = layers.MaxPooling2D((2, 2),
                            strides=(2, 2),
                            padding='same',
                            name='block2_pool')(x)

    # block 3
    x = layers.Conv2D(128, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block3_conv1')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block3_bn1')(x)
    x = layers.Activation('relu', name = 'block3_act1')(x)
    x = layers.Conv2D(128, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block3_conv2')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block3_bn2')(x)
    x = layers.Activation('relu', name = 'block311_act2')(x)
    x = layers.MaxPooling2D((3, 3),
                            strides=(3, 3),
                            padding='same',
                            name='block3_pool')(x)

    x = layers.Conv2D(256, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block31_conv1')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block31_bn1')(x)
    x = layers.Activation('relu', name = 'block31_act1')(x)
    x = layers.Conv2D(128, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block31_conv2')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block31_bn2')(x)
    x = layers.Activation('relu', name = 'block31_act2')(x)
    x = layers.MaxPooling2D((3, 3),
                            strides=(3, 3),
                            padding='same',
                            name='block31_pool')(x)

  # block 4
    x = layers.Conv2D(1024, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block41_conv1')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block41_bn1')(x)
    x = layers.Activation('relu', name = 'block41_act1')(x)
    x = layers.Conv2D(512, (3,3),
                      padding = 'same', use_bias = False,
                      name = 'block41_conv2')(x)
    x = layers.Dropout(0.5, name = 'block4_dropout')(x)
    x = layers.BatchNormalization(axis = channel_axis, name = 'block4_bn2')(x)
    x = layers.Activation('relu', name = 'block4_act2')(x)
    x = layers.MaxPooling2D((3, 3),
                            strides=(3, 3),
                            padding='same',
                            name='block4_pool')(x)
    x = layers.Flatten(name='flatten')(x)
    x = layers.Dense(512, activation='relu', name='fc1')(x)
    x = layers.Dense(1024, activation='relu', name='fc11')(x)
    x = layers.Dense(512, activation='relu', name='fc3')(x)
    x = layers.Dense(512, activation='relu', name='fc4')(x)
    x = layers.Dense(256, activation='relu', name='fc5')(x)
    x = layers.Dense(64, activation='relu', name='fc6')(x)
    x = layers.Dense(2, activation='softmax', name='predictions')(x)
    model = Model(inputs=img_input, outputs=x, name = 'own_build_model')
    return model
model = model()

layered_view(model, legend=True)

В этом коде мы создаем нейронную сеть с несколькими блоками, каждый с различными параметрами. Мы также увеличиваем количество узлов в каждом скрытом слое, что делает нашу сеть более сложной.

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

В заключение, VisualKeras — мощный инструмент для визуализации нейронных сетей. Это позволяет нам создавать интуитивно понятные диаграммы наших сетей, облегчая их понимание и отладку. Используя VisualKeras, мы можем быстро и легко создавать визуализации наших нейронных сетей, что может быть большим преимуществом при разработке и тестировании моделей машинного обучения.