ConvTranspose2d(逆卷積)的原理和計算ConvTranspose2d原理,深度網絡如何進行上采樣?

      網友投稿 1758 2025-03-31

      目錄

      原理

      計算公式

      Keras中的Conv2DTranspose詳解

      實例

      pytorch中的ConvTranspose2d參數詳解

      實例

      缺點

      原理

      解釋什么是逆卷積,先得明白什么是卷積。

      先說卷積:對于一個圖片A,設定它的高度和寬度分別為Height,Width,通道數為Channels。 然后我們用卷積核(kernel * kernel)去做卷積,(這里設定卷積核為正方形,實際長方形也可以類推,相信我,不會很難),步長為stride(同樣的,不區分高寬方向),做padding。卷積后得到B。

      重復上面的話就是利用一個卷積操作將A變成B。

      那么,在這個前提下,逆卷積就是將B變成A。

      那么怎么規定卷積核這些參數呢,這些又是什么意思?

      對于卷積操作,我不多說了,這里不做解釋。而且我們應該比較清楚如何從輸入的圖片大小格式等得到新的圖片大小,或許有的人熟悉用特征圖來代替圖片。

      對于逆卷積操作,卷積核的設置就是和卷積操作相同。如:給定一個特征圖x,并輸入卷積核設置。我們就是想得到一個特征圖y經過輸入的卷積核進行卷積,然后得到特征圖x,這里我們要求的就是特征圖y。

      寫到這里大家應該比較理解我為什么把它翻譯成逆卷積了吧。

      如果不懂,也沒事,可以看下面的例子。

      舉個例子:

      上面這個是一個卷積操作。

      我們輸入的特征圖為:x: 44channels_in,channels_in表示通道數

      卷積核設置:無padding, kernel size為3*3, 步長stride 為1,

      輸出的特征圖為y,2 * 2 * channels_out,channels_out也是通道數。

      逆卷積操作的輸入就是特征圖y, 卷積核設置同上。要求上面的特征圖x。

      這里先給出這個對應逆卷積的說明圖。后面給出泛化的說明。

      計算公式

      shape:

      輸入: (N,C_in,H_in,W_in)

      輸出: (N,C_out,H_out,W_out)

      H_{out}=(H_{in}-1)*stride[0]-2*padding[0]+kernel_size[0]+output_padding[0]

      W_{out}=(W_{in}-1)*stride[1]-2*padding[1]+kernel_size[1]+output_padding[1]

      輸入特征圖:3 × 3

      輸入卷積核參數:kernel為3 × 3 , stride為2, padding為1,output_padding為1

      新的特征圖A’: (3-1)×2-2+3+1=6 。

      所以輸出的特征圖大小:6×6

      這樣就實現了將特征圖放大一倍。

      Keras中的Conv2DTranspose詳解

      tf.keras.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

      )

      參數:

      filters:整數,輸出空間的維數(即卷積中的濾波器數).

      kernel_size:一個元組或2個正整數的列表,指定過濾器的空間維度;可以是單個整數,以指定所有空間維度的相同值.

      strides:一個元組或2個正整數的列表,指定卷積的步幅;可以是單個整數,以指定所有空間維度的相同值.

      padding:可以是一個"valid"或"same"(不區分大小寫).

      output_padding:一個由2個整數組成的整數或元組/列表,指定沿輸出張量的高度和寬度填充的數量。可以是單個整數,為所有空間維度指定相同的值。給定維度上的輸出填充量必須低于同一維度上的步長。如果設置為None(默認),輸出形狀將被推斷。

      data_format:一個字符串,可以是一個channels_last(默認)或channels_first,表示輸入中維度的順序.channels_last對應于具有形狀(batch, height, width, channels)的輸入,而channels_first對應于具有形狀(batch, channels, height, width)的輸入.

      dilation_rate:一個由2個整數組成的整數或元組/列表,指定用于膨脹卷積的膨脹率。可以是單個整數,為所有空間維度指定相同的值。目前,指定任何dilation_rate值!= 1與指定任何stride值!= 1是不兼容的。

      activation:激活功能,將其設置為“None”以保持線性激活.

      use_bias:Boolean,表示該層是否使用偏差.

      kernel_initializer:卷積內核的初始化程序.

      bias_initializer:偏置向量的初始化器,如果為None,將使用默認初始值設定項.

      kernel_regularizer:卷積內核的可選正則化器.

      bias_regularizer:偏置矢量的可選正則化器.

      activity_regularizer:輸出的可選正則化函數.

      kernel_constraint:由Optimizer更新后應用于內核的可選投影函數(例如,用于實現層權重的范數約束或值約束);該函數必須將未投影的變量作為輸入,并且必須返回投影變量(必須具有相同的形狀);在進行異步分布式培訓時,使用約束是不安全的.

      bias_constraint:由Optimizer更新后應用于偏差的可選投影函數.

      實例

      def get_model():

      inputs = Input(shape=(64, 64, 3))

      conv_1 = Conv2D(1, (3, 3), strides=(1, 1), padding='same')(inputs)

      act_1 = Activation('relu')(conv_1)

      conv_2 = Conv2D(64, (3, 3), strides=(1, 1), padding='same')(act_1)

      act_2 = Activation('relu')(conv_2)

      deconv_1 = Conv2DTranspose(64, (3, 3), strides=(1, 1), padding='same')(act_2)

      act_3 = Activation('relu')(deconv_1)

      merge_1 = concatenate([act_3, act_1], axis=3)

      deconv_2 = Conv2DTranspose(1, (3, 3), strides=(1, 1), padding='same')(merge_1)

      act_4 = Activation('relu')(deconv_2)

      model = Model(inputs=[inputs], outputs=[act_4])

      model.compile(optimizer='adadelta', loss=dice_coef_loss, metrics=[dice_coef])

      return model

      pytorch中的ConvTranspose2d參數詳解

      class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True)

      說明

      stride: 控制相關系數的計算步長

      dilation: 用于控制內核點之間的距離,詳細描述在這里

      groups: 控制輸入和輸出之間的連接:?group=1,輸出是所有的輸入的卷積;group=2,此時相當于有并排的兩個卷積層,每個卷積層計算輸入通道的一半,并且產生的輸出是輸出通道的一半,隨后將這兩個輸出連接起來。

      參數kernel_size,stride,padding,dilation數據類型: 可以是一個int類型的數據,此時卷積height和width值相同; 也可以是一個tuple數組(包含來兩個int類型的數據),第一個int數據表示height的數值,第二個int類型的數據表示width的數值。

      注意

      由于內核的大小,輸入的最后的一些列的數據可能會丟失。因為輸入和輸出是不是完全的互相關。因此,用戶可以進行適當的填充(padding操作)。

      參數:

      in_channels(int) – 輸入信號的通道數

      out_channels(int) – 卷積產生的通道數

      kerner_size(int?or?tuple) - 卷積核的大小

      stride(int?or?tuple,optional) - 卷積步長

      padding(int?or?tuple,?optional) - 輸入的每一條邊補充0的層數

      output_padding(int?or?tuple,?optional) - 輸出的每一條邊補充0的層數

      dilation(int?or?tuple,?optional) – 卷積核元素之間的間距

      groups(int,?optional) – 從輸入通道到輸出通道的阻塞連接數

      bias(bool,?optional) - 如果bias=True,添加偏置

      實例

      ConvTranspose2d在UNet的應用:

      import torch.nn as nn

      import torch

      from torch import autograd

      #把常用的2個卷積操作簡單封裝下

      class DoubleConv(nn.Module):

      def __init__(self, in_ch, out_ch):

      super(DoubleConv, self).__init__()

      self.conv = nn.Sequential(

      nn.Conv2d(in_ch, out_ch, 3, padding=1),

      nn.BatchNorm2d(out_ch), #添加了BN層

      nn.ReLU(inplace=True),

      nn.Conv2d(out_ch, out_ch, 3, padding=1),

      nn.BatchNorm2d(out_ch),

      nn.ReLU(inplace=True)

      )

      def forward(self, input):

      return self.conv(input)

      class Unet(nn.Module):

      def __init__(self, in_ch, out_ch):

      super(Unet, self).__init__()

      self.conv1 = DoubleConv(in_ch, 64)

      self.pool1 = nn.MaxPool2d(2)

      self.conv2 = DoubleConv(64, 128)

      self.pool2 = nn.MaxPool2d(2)

      self.conv3 = DoubleConv(128, 256)

      self.pool3 = nn.MaxPool2d(2)

      self.conv4 = DoubleConv(256, 512)

      self.pool4 = nn.MaxPool2d(2)

      self.conv5 = DoubleConv(512, 1024)

      ConvTranspose2d(逆卷積)的原理和計算ConvTranspose2d原理,深度網絡如何進行上采樣?

      # 逆卷積,也可以使用上采樣(保證k=stride,stride即上采樣倍數)

      self.up6 = nn.ConvTranspose2d(1024, 512, 2, stride=2)

      self.conv6 = DoubleConv(1024, 512)

      self.up7 = nn.ConvTranspose2d(512, 256, 2, stride=2)

      self.conv7 = DoubleConv(512, 256)

      self.up8 = nn.ConvTranspose2d(256, 128, 2, stride=2)

      self.conv8 = DoubleConv(256, 128)

      self.up9 = nn.ConvTranspose2d(128, 64, 2, stride=2)

      self.conv9 = DoubleConv(128, 64)

      self.conv10 = nn.Conv2d(64, out_ch, 1)

      def forward(self, x):

      c1 = self.conv1(x)

      p1 = self.pool1(c1)

      c2 = self.conv2(p1)

      p2 = self.pool2(c2)

      c3 = self.conv3(p2)

      p3 = self.pool3(c3)

      c4 = self.conv4(p3)

      p4 = self.pool4(c4)

      c5 = self.conv5(p4)

      up_6 = self.up6(c5)

      merge6 = torch.cat([up_6, c4], dim=1)

      c6 = self.conv6(merge6)

      up_7 = self.up7(c6)

      merge7 = torch.cat([up_7, c3], dim=1)

      c7 = self.conv7(merge7)

      up_8 = self.up8(c7)

      merge8 = torch.cat([up_8, c2], dim=1)

      c8 = self.conv8(merge8)

      up_9 = self.up9(c8)

      merge9 = torch.cat([up_9, c1], dim=1)

      c9 = self.conv9(merge9)

      c10 = self.conv10(c9)

      out = nn.Sigmoid()(c10)

      return out

      缺點

      在基于CNN的超分辨率中,經常在最后一層使用stride>1的deconv layer,而這會造成棋盤格噪聲。如下圖所示

      具體產生原因

      上面的黑格子是表示原始圖像中的某一個像素點,白色的表示轉置卷積中的stride,一般是用0去填充。下面一層就是deconv生成的圖像。可以看到stride不能整除size的時候,就會出現棋盤格效應(當然,就算整除也不能完全消除)。

      如何避免呢?

      采用一般的插值算法(NN或bilinear)先把圖像放大到目標分辨率,再用普通的conv去做計算,替代deconv layer。

      最后效果

      參考:

      深度學習中反卷積層(轉置卷積)引起的棋盤格噪聲

      https://w.cnblogs.com/sunny-li/p/10193141.html

      ConvTranspose2d原理,深度網絡如何進行上采樣?

      https://blog.csdn.net/qq_27261889/article/details/86304061

      深度學習 神經網絡

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:生產制造管理制度(生產制造企業管理制度)
      下一篇:ABS函數的公式語法和用法說明
      相關文章
      亚洲日本国产综合高清| 91精品国产亚洲爽啪在线观看| 4338×亚洲全国最大色成网站| 91午夜精品亚洲一区二区三区| 亚洲成色www久久网站夜月| avtt亚洲天堂| 久久精品熟女亚洲av麻豆| 亚洲欧美国产日韩av野草社区| 亚洲男人天堂av| 亚洲一区二区中文| 久久精品国产亚洲AV无码偷窥| 亚洲va中文字幕无码久久| 亚洲午夜国产精品无码| 亚洲人成伊人成综合网久久久| 337p日本欧洲亚洲大胆裸体艺术| 国产国拍亚洲精品福利| 国产亚洲精品福利在线无卡一| 国产亚洲av人片在线观看| 国产精品亚洲美女久久久 | 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲欧洲自拍拍偷精品 美利坚| 亚洲成a人片在线观看久| 亚洲精品99久久久久中文字幕| 亚洲精品亚洲人成在线观看下载| 亚洲一级Av无码毛片久久精品| 中文字幕无码精品亚洲资源网| 亚洲精品国产字幕久久不卡| 亚洲Av永久无码精品三区在线 | 亚洲第一福利视频| 亚洲视频免费在线播放| 亚洲人成网站18禁止久久影院| 国产成人精品日本亚洲直接| 亚洲午夜福利在线视频| 亚洲av日韩综合一区二区三区| 久久精品国产亚洲AV电影网| 亚洲成A人片在线观看无码3D| 亚洲精品国自产拍在线观看| 亚洲色偷偷综合亚洲AVYP| 久久亚洲成a人片| 亚洲制服丝袜在线播放| 亚洲日韩精品国产一区二区三区|