весовая визуализация 3d сверточного ядра - PullRequest
1 голос
/ 28 февраля 2020

Я использую трехмерное ядро ​​размером 3x3x3 для конвойционного слоя и хотел бы изобразить вес слоя.

Поскольку построение графика в 3d невозможно, я попытался разделить ядра на 3 3 × 3. для построения. Является ли этот подход корректным?

Слой conv состоит из 5 слоев # model.add (elements.Conv3D (5, (3, 3, 3), padding = 'same'))

Ниже приведен код, который я использовал для построения весов

from keras.models import load_model
mymodel = load_model(‘model.hdf5′)

from matplotlib import pyplot as plt
# load the model

# retrieve weights from the 1st conv layer layer
filters, biases = mymodel.layers[0].get_weights()
# normalize filter values to 0-1 so we can visualize them
f_min, f_max = filters.min(), filters.max()
filters = (filters – f_min) / (f_max – f_min)
#shape of filters (3, 3, 3, 1, 5)
n_filters, ix = 5, 1
for i in range(n_filters):
# get the filter
f = filters[:,:, :, :, i]
f = f[:,:,:,0]
# kernel shape 3x3x3 but to plot it converting into 3 3×3 filters
for j in range(3):
# specify subplot and turn of axis
ax = plt.subplot(n_filters, 3, ix)
ax.set_xticks([])
ax.set_yticks([])
# plot filter channel in grayscale
plt.imshow(f[:, :, j], cmap=’gray’)
ix += 1
# show the figure
plt.show()

Этот метод верен или есть какой-то лучший способ сделать это?

Ждем вашего ответа

1 Ответ

0 голосов
/ 06 апреля 2020

Код, который вы использовали, хорош для отображения ядра Conv2D Convolution в оттенках серого ИЛИ ядра Conv3D Convolution в цвете (из-за глубины ядра, вызывающей слияние трех изображений в оттенках серого).

Вам необходимо изменить код, как показано ниже, чтобы сделать его многоразовым для печати ядра Conv3d Convolution в оттенках серого. Вы должны изменить Depth, outgoing_channels и incoming_channels в коде в соответствии с ядром слоев Conv3D, которое вы печатаете.

Измененный код -

# normalize filter values to 0-1 so we can visualize them
f_min, f_max = filters.min(), filters.max()
filters = (filters - f_min) / (f_max - f_min)
# plot first few filters
# n_filters = outgoing channels
outgoing_channels = 2
n_filters, ix = outgoing_channels, 1
for i in range(n_filters):
    # get the filter
    f = filters[:, :, :, :, i]
    # plot each channel separately
    # Range of incoming channels
    incoming_channels = 4
    for j in range(incoming_channels):
        # Range of Depth of the kernel .i.e. 3
        Depth = 3
        for k in range(Depth):
            # specify subplot and turn of axis
            ax = pyplot.subplot((outgoing_channels*3), incoming_channels, ix)
            ax.set_xticks([])
            ax.set_yticks([])
            # plot filter channel in grayscale
            pyplot.imshow(f[:, :, k,j], cmap='gray')
            ix += 1
# show the figure
pyplot.show()

Сквозной пример: Этот пример объясняет

  1. Создает модель, имеющую слой Conv3D.
  2. Вычисление параметров слоя и разбивая их, чтобы понять вес слоя и вес смещения.
  3. распечатать ядро ​​свертки слоя.

# (1) Importing dependency
%tensorflow_version 1.x
import tensorflow as tf
import keras
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D, Conv3D
from keras.layers.normalization import BatchNormalization
import numpy as np

np.random.seed(1000)

# (2) Get Data
import tflearn.datasets.oxflower17 as oxflower17
x, y = oxflower17.load_data(one_hot=True)
x = np.expand_dims(x,-1)

# (3) Create a sequential model
model = Sequential()

# 1st Convolutional Layer
model.add(Conv3D(filters=2, input_shape=(224,224,3,1), kernel_size=(3,3,3), strides=(4,4,4), padding='Same'))
model.add(Activation('relu'))

# 2nd Convolutional Layer
model.add(Conv3D(filters=4, kernel_size=(3,3,3), strides=(1,1,1), padding='Same'))
model.add(Activation('relu'))

# 3rd Convolutional Layer
model.add(Conv3D(filters=2, kernel_size=(3,3,3), strides=(1,1,1), padding='Same'))
model.add(Activation('relu'))

# Passing it to a dense layer
model.add(Flatten())
# 1st Dense Layer
model.add(Dense(100))
model.add(Activation('relu'))

# Output Layer
model.add(Dense(17))
model.add(Activation('softmax'))

model.summary()

# (4) Compile 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


model.fit(x, y, batch_size=64, epochs= 4, verbose=1, validation_split=0.2, shuffle=True)

Вывод кода -

Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv3d_10 (Conv3D)           (None, 56, 56, 1, 2)      56        
_________________________________________________________________
activation_26 (Activation)   (None, 56, 56, 1, 2)      0         
_________________________________________________________________
conv3d_11 (Conv3D)           (None, 56, 56, 1, 4)      220       
_________________________________________________________________
activation_27 (Activation)   (None, 56, 56, 1, 4)      0         
_________________________________________________________________
conv3d_12 (Conv3D)           (None, 56, 56, 1, 2)      218       
_________________________________________________________________
activation_28 (Activation)   (None, 56, 56, 1, 2)      0         
_________________________________________________________________
flatten_6 (Flatten)          (None, 6272)              0         
_________________________________________________________________
dense_11 (Dense)             (None, 100)               627300    
_________________________________________________________________
activation_29 (Activation)   (None, 100)               0         
_________________________________________________________________
dense_12 (Dense)             (None, 17)                1717      
_________________________________________________________________
activation_30 (Activation)   (None, 17)                0         
=================================================================
Total params: 629,511
Trainable params: 629,511
Non-trainable params: 0
_________________________________________________________________
Train on 1088 samples, validate on 272 samples
Epoch 1/4
1088/1088 [==============================] - 2s 1ms/step - loss: 2.8274 - acc: 0.0597 - val_loss: 2.8071 - val_acc: 0.0551
Epoch 2/4
1088/1088 [==============================] - 1s 522us/step - loss: 2.7204 - acc: 0.1728 - val_loss: 2.6962 - val_acc: 0.1360
Epoch 3/4
1088/1088 [==============================] - 1s 517us/step - loss: 2.4334 - acc: 0.3612 - val_loss: 2.4341 - val_acc: 0.2316
Epoch 4/4
1088/1088 [==============================] - 1s 518us/step - loss: 1.9551 - acc: 0.4577 - val_loss: 2.1545 - val_acc: 0.3309
<keras.callbacks.History at 0x7ff4bba5e5f8>

Позволяет напечатать ядра свертки для нижнего слоя (3-й слой Conv3D в модели) -

conv3d_12 (Conv3D)            (None, 56, 56, 1, 2)      218       
_________________________________________________________________

Параметр рассчитывается следующим образом -

Параметры слоя Conv2D - «( n m l * k * 3) + k ”

  • Размер фильтра равен« n * m ».
  • «l» входящих_каналов в качестве входа. В нашем случае это 4.
  • «k» outgoing_channels в качестве вывода. В нашем случае это 2.

Таким образом, params = (3 * 3 * 4 * 2 * 3) +2 = 218

Params равны layer weights + Bias Weights. Таким образом, удаляем смещения .ie 2 (смещения равны карте объектов или каналу в качестве вывода). Таким образом, всего layer weights = 218 - 2 = 216. Таким образом, мы должны получить 216/9 = 24 полутоновых изображения 3 * 3.

Я сделал код generi c так что это многоразово. Вам просто нужно изменить Depth, outgoing_channels и incoming_channels, которые будут соответствовать всем изображениям в оттенках серого этого слоя. В нашем случае outgoing_channels = 2 и incoming_channels = 4.

Запустите код визуализации -

from matplotlib import pyplot

# retrieve weights from the 3rd Conv3D layer
filters, biases = model.layers[4].get_weights()

# normalize filter values to 0-1 so we can visualize them
f_min, f_max = filters.min(), filters.max()
filters = (filters - f_min) / (f_max - f_min)
# plot first few filters
# n_filters = outgoing channels
outgoing_channels = 2
n_filters, ix = outgoing_channels, 1
for i in range(n_filters):
    # get the filter
    f = filters[:, :, :, :, i]
    # plot each channel separately
    # Range of incoming channels
    incoming_channels = 4
    for j in range(incoming_channels):
        # Range of Depth of the kernel .i.e. 3
        Depth = 3
        for k in range(Depth):
            # specify subplot and turn of axis
            ax = pyplot.subplot((outgoing_channels*3), incoming_channels, ix)
            ax.set_xticks([])
            ax.set_yticks([])
            # plot filter channel in grayscale
            pyplot.imshow(f[:, :, k,j], cmap='gray')
            ix += 1
# show the figure
pyplot.show()

Вывод кода визуализации -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...