以前一直覺得卷積是二維的操做,而到今天才發現卷積實際上是在volume上的卷積。好比輸入的數據是channels*height*width(3*10*10),咱們定義一個核函數大小爲3*3,則輸出是8*8。實際核函數的參數量是3*3*channels,在本例子中就是3*3*3。數組
舉例:ide
假設輸入的tensor是3*10*10,定義一個大小爲3*3的kernel,若是進行一個conv2d操做,輸出的feature map是5的話,那麼這個conv2d涉及的參數數是3*3*3*5+5=140個,輸出大小5*8*8。其中3*3*3表明的是核參數,5表明的是bias數。函數
驗證代碼:spa
from keras.layers import Dense, Conv2D
from keras.models import Sequential
model = Sequential()
conv1 = Conv2D(5, 3, input_shape=(3, 10, 10))
model.add(conv1)
print(model.summary())3d
_________________________________________________________________input
Layer (type) Output Shape Param # io
=========================================================import
conv2d_1 (Conv2D) (None, 5, 8, 8) 140 model
=========================================================map
Total params: 140
Trainable params: 140
Non-trainable params: 0
_________________________________________________________________
3D卷積意思是指在多個channel的volume上進行convolution操做。好比:5個4*10*10(深度、高度、寬度)大小的volume組成的高維數組。假設核大小爲2*2*2,stride爲1,輸出feature map的數量爲4,那麼參數數爲2*2*2*channels(5)*output feature maps(4)+4=164。輸出大小爲4*3*9*9。其中第一個4對應的是feature map數,第二個3對應的是深度,第三個9對應的是高度,第四個9對應的是寬度。
驗證代碼:
from keras.layers import Conv3D
from keras.models import Sequential
model = Sequential()
conv1 = Conv3D(4, 2, input_shape=(5, 4, 10, 10))
model.add(conv1)
print(model.summary())
_________________________________________________________________
Layer (type) Output Shape Param #
=========================================================
conv3d_1 (Conv3D) (None, 4, 3, 9, 9) 164
=========================================================
Total params: 164
Trainable params: 164
Non-trainable params: 0
_________________________________________________________________