Код, который вы использовали, хорош для отображения ядра 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()
Сквозной пример: Этот пример объясняет
- Создает модель, имеющую слой Conv3D.
- Вычисление параметров слоя и разбивая их, чтобы понять вес слоя и вес смещения.
- распечатать ядро свертки слоя.
# (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](https://i.stack.imgur.com/x3xzD.png)