小生很是推薦你們再也不使用卷積所帶的填充方式,雖然那種方式簡單,但缺陷太多。① 不能根據本身的須要來決定上與下填充不等的邊界,左右填充不等的邊界;② 邊界填充零容易出現僞影的狀況,對實驗效果影響比較大。將卷積中的Padding方式換爲卷積前Padding效果會更佳,如下列了四種填充方式(零填充,常數填充,鏡像填充,複製填充)。spa
小生就不贅言了,客官請下觀~~code
零填充是常數填充的特例,這種填充方式和卷積中的填充的相似,都是填充零元素,不過這個比卷積填充更靈活,咱們能夠根據本身的須要再上下左右分別填充相應的0元素。blog
1 import torch 2 import torch.nn as nn 3 4 5 # ================== 零填充 ================== 6 def conv_ZeroPad2d(): 7 # 定義一個四維數據:(batchSize, channel, height, width) 8 data = torch.tensor([[[[1, 2, 3], 9 [4, 5, 6], 10 [7, 8, 9]]]]).float() 11 print("data_shape: ", data.shape) 12 print("data: ", data) 13 # 零填充,在邊界填充n個0,分別爲:左、右、上、下 14 ZeroPad = nn.ZeroPad2d(padding=(1, 2, 1, 2)) 15 data1 = ZeroPad(data) 16 print("data1_shape: ", data1.shape) 17 print("data1: ", data1) 18 19 20 if __name__ == '__main__': 21 conv_ZeroPad2d()
能夠看到,分別在左邊填充1列0元素,右邊填充2列0元素,上邊填充1列0元素,下邊填充2列0元素。博客
常數填充方式, 能夠根據本身的須要在上下左右分別填充指定的元素。it
1 import torch 2 3 4 # ================== 常量填充 ================== 5 def conv_ConstantPad2d(): 6 # 定義一個四維數據:(batchSize, channel, height, width) 7 data = torch.tensor([[[[1, 2, 3], 8 [4, 5, 6], 9 [7, 8, 9]]]]).float() 10 print("data_shape: ", data.shape) 11 print("data: ", data) 12 # 用給定的紙填充,0填充是常亮填充的特列,分別爲:左、右、上、下 13 ConstantPad = nn.ConstantPad2d(padding=(1, 2, 1, 2), value=10) 14 data1 = ConstantPad(data) 15 print("data1_shape: ", data1.shape) 16 print("data1: ", data1) 17 18 19 if __name__ == '__main__': 20 conv_ConstantPad2d()
能夠看到,分別在左邊填充1列10元素,右邊填充2列10元素,上邊填充1列10元素,下邊填充2列10元素。io
鏡像填充方式是根據對稱性來填充的。class
1 import torch 2 3 4 # ================== 鏡像填充 ================== 5 def conv_ReflectionPad2d(): 6 # 定義一個四維數據:(batchSize, channel, height, width) 7 data = torch.tensor([[[[1, 2, 3], 8 [4, 5, 6], 9 [7, 8, 9]]]]).float() 10 print("data_shape: ", data.shape) 11 print("data: ", data) 12 # 複製邊界n次,分別爲:左、右、上、下 13 ReflectionPad = nn.ReflectionPad2d(padding=(1, 2, 1, 2)) 14 data1 = ReflectionPad(data) 15 print("data1_shape: ", data1.shape) 16 print("data1: ", data1) 17 18 19 if __name__ == '__main__': 20 conv_ReflectionPad2d()
複製填充方式,小生很是推薦。複製填充是複製最外邊界的元素來填充,這樣填充的元素與邊界元素相近,對實驗結果的影響會降到最小。import
1 import torch 2 3 4 # ================== 重複填充 ================== 5 def conv_ReplicationPad2d(): 6 # 定義一個四維數據:(batchSize, channel, height, width) 7 data = torch.tensor([[[[1, 2, 3], 8 [4, 5, 6], 9 [7, 8, 9]]]]).float() 10 print("data_shape: ", data.shape) 11 print("data: ", data) 12 # 用對稱位置的像素來填充,分別爲:左、右、上、下 13 ReplicationPad = nn.ReplicationPad2d(padding=(1, 2, 1, 2)) 14 data1 = ReplicationPad(data) 15 print("data1_shape: ", data1.shape) 16 print("data1: ", data1) 17 18 19 if __name__ == '__main__': 20 conv_ReplicationPad2d()
能夠看到,填充的元素與最外邊界的元素相同。channel
努力去愛周圍的每個人,付出,不必定有收穫,可是不付出就必定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願個人博客對你有所幫助(*^▽^*)(*^▽^*)!float
若是客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)!