pytorch必須掌握的4種邊界Padding方法

2021-02-20 機器之眼

卷積操作作為卷積神經網絡的核心模塊,在其計算過程中必須考慮圖像「邊緣像素」的卷積方式。查閱資料發現,我們可以採用「卷積之前進行邊界填充」或「卷積之後進行邊界填充兩種方式」,同時邊界填充的具體手段包含常量填充、零填充、鏡像填充以及重複填充等。

在具體分析各種Pad之前,先創建一個2dTensor用於測試後面的填充操作:

x = torch.Tensor([[1, 2], [3, 4]])

創建的Tensor數值分別1、2、3、4:

1、零填充ZeroPad2d

      我們最常用的是nn.ZeroPad2d,也就是對Tensor使用0進行邊界填充,我們可以指定tensor的四個方向上的填充數,比如左邊添加1dim、右邊添加2dim、上邊添加3dim、下邊添加4dim,即指定paddin參數為(1,2,3,4),如下:

pad = nn.ZeroPad2d(padding=(1, 2, 3, 4))
y = pad(x)

得到的y是x在四個方向上按照(1,2,3,4)進行的補零操作,如下圖:

2、常數填充ConstantPad2d

      零填充是常數填充的一個特例,常數填充nn.ConstantPad2d()需要我們指定填充所用的常數值value核填充數padding,這裡選擇四個方向上均填充為1dim,即padding為(1,1,1,1),代碼如下:

pad = nn.ConstantPad2d(padding=(1, 1, 1, 1), value=666)
y = pad(x)

得到的y在四周分別用666進行填充:

3、鏡像填充ReflectionPad2d

      鏡像填充的方式相比於前面使用固定數值進行填充,有可能獲得更好的卷積結果。鏡像填充封裝在nn.ReflectionPad2d中,其填充方式為新的dim值使用反方向的最下邊元素的值,代碼如下:

pad = nn.ReflectionPad2d(padding=(1, 1, 1, 1))
y = pad(x)

從下圖結果可以看出第一行第一列的4是原來右下角的4,第一行第二列的3原來左下角的3:

4、重複填充ReplicationPad2d

      重複填充即重複圖像的邊緣像素值,將新的邊界像素值用邊緣像素值擴展,封裝於nn.ReplicationPad2d()中,同樣可以指定4個方向的填充數量:

pad = nn.ReplicationPad2d(padding=(1, 1, 1, 1))
y = pad(x)

從下圖得到的結果可以看出,填充後邊界像素值是原來的1、2、3、4的複製:

總結:

      對於pytorch是在卷積之前還是卷積之後進行padding這個問題,根據【1】中所述,應該是卷積之前進行的填充;上文中dim並不是維度的意思,自己沒有找到合適的詞描述添加的「行或列」,就用了dim一詞;填充方式的選擇對於圖像較小的情況下比較重要,對於尺寸較大的圖像來說如何填充影響可能並不大。

參考:

【1】https://discuss.pytorch.org/t/difference-between-padding-then-convolution-or-convolution-with-padding/33790

相關焦點

  • 讓PyTorch訓練速度更快,你需要掌握這17種方法
    選自efficientdl.com作者:LORENZ KUHN機器之心編譯編輯:陳萍掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學習訓練。
  • 關於Padding實現的一些細節
    點擊上方「CVer」,選擇加"星標"或「置頂」重磅乾貨,第一時間送達作者:JamesPlurhttps://zhuanlan.zhihu.com/p/73118626本文已授權,未經允許,不得二次轉載Padding的值Padding是指在向量的每一維前後填充一定大小的邊界
  • 用PyTorch部署模型
    我們看一下今天的roadmap:1、使用docker安裝2、導出模型3、定義handler4、保存模型為了展示torchserve,我們將提供一個經過全面訓練的ResNet34進行圖像分類的服務。安裝torchserve最好的方法是使用docker。
  • Pytorch轉Msnhnet模型思路分享
    (思路來源pytorch_to_caffe) 在pytorch的Op在執行之前,對此Op進行截取,以獲取相關信息,從而實現網絡構建.優點: 幾乎可以完成所有pytorch的op導出.缺點: 實現複雜,容易誤操作,可能影響pytorch本身結果錯誤.代碼實現: 通過構建Hook類, 重寫op, 並替換原op操作,獲取op的參數.
  • Padding與line-height的區別
    Padding屬性與line-height的區別最近有朋友提出一個問題,padding與line-height的區別。這是CSS基礎知識,對盒模型知識與布局以及相關屬性不是很了解的時候,是很容易混淆與分不清楚的。其實padding是布局設置,對容器進行內邊距定義。而line-height是行距設置,設置對象(如文本)的行高。
  • CSS中padding-bottom和padding-right屬性的區別
    CSS中padding-bottom和padding-right屬性的區別 本文向大家介紹一下CSS中padding-bottom 屬性和padding-right屬性的區別,padding-bottom 屬性設置元素的下內邊距(底部空白),而padding-left 屬性設置元素右內邊距(空白)。
  • CSS中padding-top和padding-left屬性的區別
    CSS中padding-top和padding-left屬性的區別 本文向大家描述一下CSS中padding-top和padding-left屬性的區別,padding-top屬性設置元素的上內邊距(空間),而padding-left 屬性設置元素左內邊距(空白)。
  • 13個算法工程師必須掌握的PyTorch Tricks
    本文轉載自【微信公眾號:機器學習算法與Python精研 ,ID:AITop100】,經微信公眾號授權轉載,如需轉載原文作者聯繫目錄1、指定GPU編號2、查看模型每層輸出詳情3、梯度裁剪4、4、擴展單張圖片維度因為在訓練時的數據維度一般都是 (batch_size, c, h, w),而在測試時只輸入一張圖片,所以需要擴展維度,擴展維度有多個方法:import cv2import torch
  • 實例解析CSS padding 屬性用法
    實例解析CSS padding 屬性用法 本文向大家介紹一下CSS padding 屬性的定義和用法,padding 簡寫屬性在一個聲明中設置所有內邊距屬性。這個簡寫屬性設置元素所有內邊距的寬度,或者設置各邊上內邊距的寬度。
  • PyTorch 生成對抗網絡 01.生成對抗網絡
    stride=(2, 2), padding=(1, 1), bias=False) (4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (5): ReLU(inplace=True) (6): ConvTranspose2d(256, 128, kernel_size
  • 淺析Shiro Padding Oracle Attack
    流程圖如下:合天網安實驗室相關實驗推薦:《AES加密算法分析》有過CTF經驗的同學可能會對反序列化這個詞比較敏感,這在CTF賽題中是一個常常出現的題型,有的同學可能立馬就能想到能不能構造一個惡意的對象,當它被反序列化時自動觸發魔術方法以達到攻擊的目的。沒錯,這正是Shiro的反序列化攻擊流程:構造一個惡意對象發送給伺服器,當伺服器執行反序列時便能觸發攻擊。
  • 基於pytorch的DeepLearning入門流程
    基於pytorch的DeepLearning學習筆記最近開始學深度學習框架pytorch,從最簡單的卷積神經網絡開始了解pytorch的框架。以下涉及到的代碼完整版請查看https://github.com/XieHanS/CPSC_ECGHbClassify_demo.git基於pytorch的DL主要分為三個模塊,數據塊,模型塊,和訓練塊。
  • 如何正確使用padding和margin
    關於padding和margin,很多同學傻傻分不清,相信通過今天的學習可以正確使用。  一、內邊距padding  默認情況下,組件相互之間是緊緊靠在一起的。但是有時候需要組件各邊之間有一定的內邊距,那就可以通過以下幾個屬性來設置,內邊距的值是具體的尺寸,如5dp。
  • Pytorch框架安裝方法(基於Anaconda環境和Pycharm IDE)
    1.6 單擊啟動Anaconda Prompt 創建虛擬「房間」通過conda創建一個名為:pytorch的虛擬「房間」,可以方便未來對不同版本的PyTorch進行管理,具體方法如下:conda create -n pytorch python=3.6
  • 基於pytorch的DeepLearning學習筆記
    基於pytorch的DeepLearning學習筆記最近開始學深度學習框架pytorch,從最簡單的卷積神經網絡開始了解pytorch的框架。基於pytorch的DL主要分為三個模塊,數據塊,模型塊,和訓練塊。
  • 17、OpenCV邊界處理
    說到OpenCV的邊界處理,少不了要先了解下什麼是濾波器。很多處理算法其實都可以歸為濾波操作,幾乎所有的濾波都涉及到圖像邊界問題。濾波器和卷積兩個術語可以認為是可以互換的。信號處理傾向於使用過濾器這個名稱,而數學界傾向於使用內核。經常出現的非線性核的一個例子是中值濾波器,它用內核中間的值取代了像素鄰域內的值。濾波器有很多種形狀。
  • CSS padding屬性用法詳解
    CSS padding屬性用法詳解 本文向大家介紹一下CSS padding屬性的用法,元素的內邊距在邊框和內容區之間,控制該區域最簡單的屬性是padding屬性。
  • PyTorch入門之PyTorch的安裝
    PyTorch是非常熱門的深度學習框架,要學習和使用pytorch,首先要安裝pytorch,不論您使用的作業系統是Windows、Mac還是Linux,都可以通過下面方法安裝。打開pytorch官網首頁:https://pytorch.org/,如下圖1所示,在QUICK START LOCALLY這部分,選擇作業系統、程式語言等,就會在「Run this Command:」後面的方框中出現對應的安裝命令,然後在作業系統對應的命令提示符窗口輸入這些安裝命令即可。
  • PyTorch中的可迭代數據集重採樣
    動機不平衡學習是一種機器學習範例,其中分類器必須從具有傾斜的類分布的數據集中學習。不平衡的數據集可能對分類器的性能產生不利影響。重新平衡數據集是處理類不平衡的一種方法。這可以通過以下方式完成:採樣不足的普通類。對稀有類進行過度採樣。兩者兼而有之。
  • 使用pytorch查看中間層特徵矩陣以及卷積核參數
    推薦一個可視化工具:TensorBoard註: 本次所使用的為AlexNet與ResNet34倆個網絡,關於這倆個網絡的詳細信息可以在我另外倆篇blog查看ResNet——CNN經典網絡模型詳解(pytorch實現)AlexNet--CNN經典網絡模型詳解(pytorch實現)