在cnn網路中,輸入影象通過卷積操作提取特徵後,輸出的尺寸常會變小,而有時我們需要將影象恢復到原來的尺寸以便進行進一步的計算(比如:影象的語義分割),那麼我們需要實現影象由小解析度到大解析度的對映的操作,叫做上取樣(upsample)。
上取樣有多種方法,比如最近鄰插值(nearest neighbor interpolation)、雙線性插值(bi-linear interpolation)等,反卷積也是上取樣的一種方法。反卷積,也叫轉置卷積,它並不是正向卷積的完全逆過程,它不能完全的恢復輸入矩陣的資料,只能恢復輸入矩陣的大小。
反卷積操作就是卷積操作的不完全逆過程,反卷積的數學原理網上有很多文章,我們這裡就不做描述了,有興趣的小夥伴可以網上參考一下其他博文。我們這裡做一下tensorflow2的conv2dtranspose操作的解釋,以便小夥伴做上取樣時候可以快速實現。
那麼,我們開始conv2dtranspose的使用介紹,首先看一下它的函式原型:
layers.conv2dtranspose(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
output_padding=none,
data_format=none,
dilation_rate=(1, 1),
activation=none,
use_bias=true,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=none,
bias_regularizer=none,
activity_regularizer=none,
kernel_constraint=none,
bias_constraint=none,
**kwargs,
)docstring:
transposed convolution layer (sometimes called deconvolution).
引數:
在dcgans網路的生成器g重使用了conv2dtranspose進行特徵的提取,我們就以dcgans網路中例子說明conv2dtranspose的使用方法。
#建立生成器
def make_generator_model():
model = tf.keras.sequential()#建立模型例項
#第一層須指定維度 #batch無限制
model.add(layers.dense(7*7*batch_size, use_bias=false, input_shape=(100,)))#desne第一層可以理解為全連線層輸入,它的秩必須小於2
model.add(layers.batchnormalization())
model.add(layers.leakyrelu())
model.add(layers.reshape((7,7,256)))
assert model.output_shape == (none,7,7,256)
#轉化為7*7*128
model.add(layers.conv2dtranspose(128,(5,5),strides=(1,1),padding='same',use_bias=false))
assert model.output_shape == (none,7,7,128)
model.add(layers.batchnormalization())
model.add(layers.leakyrelu())
#轉化為14*14*64
model.add(layers.conv2dtranspose(64,(5,5),strides=(2,2),padding='same',use_bias=false))
assert model.output_shape == (none,14,14,64)
model.add(layers.batchnormalization())
model.add(layers.leakyrelu())
#轉化為28*28*1
model.add(layers.conv2dtranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=false,activation='tanh'))
assert model.output_shape == (none, 28, 28, 1)
return model
上面**就是dcgans生成器g的網路模型**,第二層使用conv2dtranspose提取特徵。 model.add(layers.conv2dtranspose(128,(5,5),strides=(1,1),padding='same',use_bias=false))
使用說明:
1、128代表該網路層的深度,就是filter size。
2、(5,5)是我們的kernel size。
3、步長strides為(1,1)
4、padding = 『same』
padding有兩個取值,乙個"valid"或"same"(不區分大小寫)。vaild:直接使用輸入資料的大小進行卷積,沒有padding補0操作。
same:表示卷積操作中如果輸入資料不夠的話,使用0進行變節補齊。
use_bias=false 表示我們不需要偏置資料。
好了,到這就是dcgans生成器中我們引數使用的說明,那麼引數為什麼這麼使用呢?我們就來詳細解釋一下。
反卷積的計算公式分兩種情況:
反卷積的計算公式為:
2、反卷積的計算公式為:
有了卷積核反卷積公式,我們就可以在使用conv2dtranspose驗證我們所寫的引數是否符合我們的預期。
在生成器中,第二層網路model.add(layers.conv2dtranspose(128,(5,5),strides=(1,1),padding='same',use_bias=false))
可以看出,我們輸入i = 7,卷積核大小k=5,步長s=1,有padding補齊操作,並且我們想輸出o=7。我們利用反卷積公式判斷哪種,帶入第一種情況則,(7+2p - 5)%1 = 0,則(2 +2p)%1 = 0.由於模1操作等式肯定成立。那麼 ,我們就用第一種情況公式計算得出 : 7 = 1*(7 - 1) - 2p + 5,得出2p = 4,則 p = 2。說明p = 2時候,我們得出輸出為(7,7)。我們再用卷積公式驗證我們的反卷積操作是否正確,帶入卷積公式:o = (7 +2*2 - 5)/ 1 + 1 = 7,則輸出為7,說明卷積核反卷積操作都驗證成功。
同理,第三層反卷積操作為model.add(layers.conv2dtranspose(64,(5,5),strides=(2,2),padding='same',use_bias=false))
可以看出輸入為i=(7,7),卷積核k = (5,5),步長strides = 2,padding='same'(有補齊操作),打算輸出o=(14,14)的。我們利用反卷積公式帶入驗證是哪種情況,帶入公式得出,(14 + 2p - 5)%2,得出(9 + 2p)%2≠0,則我們地圖反卷積公式2:
14 = 2*(7 - 1)-2p + 5 + (14 + 2p - 5)%2 => 14 = 17 - 2p + (9 + 2p)%2。 我們分情況判斷p的值:
當p = 1,右邊為(17 - 2 + 1)=16≠14
當p = 2, 右邊為(17- 4 + 1)=14 = 14,左右成立。
則p = 2.
根據反卷積公式2,我們帶入公式驗證結果:o = 2 *(7 - 1) - 2*2 + 5 +(14 + 2*2 - 5)%2 = 12 - 4 + 5 + 1 = 14,等於我們要輸出的大小(14,14)。再根據卷積公式我們驗證反卷積結果,帶入卷積公式:o = (14 + 2* 2 - 5)/2 + 1 = 6+ 1 = 7,與輸入一致。
dcgans的輸出層輸出大小(28,28)的大小,小夥伴們可以自己計算驗證一下。
TensorFlow學習 卷積層conv2d引數
卷積層引數解釋 tf.nn.conv2d input,filter,strides,padding,use cudnn on gpu bool,data format name none input 指定需要做卷積的輸入影象,輸入要求為乙個4維的 tensor 要求輸入型別為 float32 或者f...
tensorflow2建立卷積核Conv2D函式
使用conv2d可以建立乙個卷積核來對輸入資料進行卷積計算,然後輸出結果,其建立的卷積核可以處理二維資料。依次類推,conv1d可以用於處理一維資料,conv3d可以用於處理三維資料。在進行神經層級整合時,如果使用該層作為第一層級,則需要配置input shape引數。在使用conv2d時,需要配置...
TensorFlow演示反卷積的操作
一 反卷積函式介紹 1 語法格式 def conv2d transpose value,filter,output shape,strides,padding same data format nhwc name none 2 引數說明 value 代表通過卷積操作之後的張量,一般為nhwc型別。f...