Нейронные сети — мощный инструмент машинного обучения, но их сложно понять и визуализировать. К счастью, есть инструменты, облегчающие эту задачу. Одним из таких инструментов является 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, мы можем быстро и легко создавать визуализации наших нейронных сетей, что может быть большим преимуществом при разработке и тестировании моделей машинного обучения.