vgg的思路就是利用多個小尺寸的卷積核串聯代替之前網路的大尺寸卷積核,在保持感受野不下降的前提下,減少網路的引數。雖然vgg提出較早,但它仍用在計算機視覺的各個領域內,常被作為骨架網路的一部分;vgg的利用小尺寸卷積核的思路也是後續很多優秀網路結構的原始啟發。
閒話少敘,**中,vgg復現的關鍵資訊是下面這張表:
通過上表,我們可以看到,**提出的幾種不同深度的網路從大的結構上講都分為五組,每組之內的卷積層引數都是一樣的,我們可以構造乙個通用的類,減少很多重複**。
原文中vgg都還不包括bn層,我的復現引入了bn層。
關於bn層是放在relu層前面還是後面,有不同的說法。bn在提出的**中是放在relu前面的,但是有說法稱使用relu作為啟用單元的時候,將bn層放在其後面的實踐效果更好。由於我沒有在資料集上驗證,所以採用官方的做法,放在卷積層之後,relu之前。實踐中可以根據訓練效果自行調整。
class
vgg(nn.module)
:"""
vgg builder
"""def__init__
(self, arch:
object
, num_classes=
1000)-
>
object
:super
(vgg, self)
.__init__(
) self.in_channels =
3 self.conv3_64 = self.__make_layer(
64, arch[0]
) self.conv3_128 = self.__make_layer(
128, arch[1]
) self.conv3_256 = self.__make_layer(
256, arch[2]
) self.conv3_512a = self.__make_layer(
512, arch[3]
) self.conv3_512b = self.__make_layer(
512, arch[4]
) self.fc1 = nn.linear(7*
7*512,
4096
) self.bn1 = nn.batchnorm1d(
4096
) self.bn2 = nn.batchnorm1d(
4096
) self.fc2 = nn.linear(
4096
,4096
) self.fc3 = nn.linear(
4096
, num_classes)
def__make_layer
(self, channels, num)
: layers =
for i in
range
(num):3
, stride=
1, padding=
1, bias=
false))
# same padding))
) self.in_channels = channels
return nn.sequential(
*layers)
defforward
(self, x)
: out = self.conv3_64(x)
out = f.max_pool2d(out,2)
out = self.conv3_128(out)
out = f.max_pool2d(out,2)
out = self.conv3_256(out)
out = f.max_pool2d(out,2)
out = self.conv3_512a(out)
out = f.max_pool2d(out,2)
out = self.conv3_512b(out)
out = f.max_pool2d(out,2)
out = out.view(out.size(0)
,-1)
out = self.fc1(out)
out = self.bn1(out)
out = f.relu(out)
out = self.fc2(out)
out = self.bn2(out)
out = f.relu(out)
return f.softmax(self.fc3(out)
)
網路的深入通過乙個陣列控制,陣列的元素沒每個卷積層組內卷積層的數量。
def
vgg_11()
:return vgg([1
,1,2
,2,2
], num_classes=
1000
)def
vgg_13()
:return vgg([1
,1,2
,2,2
], num_classes=
1000
)def
vgg_16()
:return vgg([2
,2,3
,3,3
], num_classes=
1000
)def
vgg_19()
:return vgg([2
,2,4
,4,4
], num_classes=
1000
)
def
test()
:# net = vgg_11()
# net = vgg_13()
# net = vgg_16()
net = vgg_19(
) summary(net,(3
,224
,224))
test(
)
輸出如下:
深度學習 Pytorch基礎
import torch import numpy as np 建立tensor 1 傳入列表 2 傳入陣列 3 呼叫api torch.empty 會用無用資料填充 0 torch.ones torch.zeros torch.rand 3,4 取0 1 torch.randint low 0,h...
Pytorch學習 6深度學習數學基礎
損失函式 loss function 是用來估量模型的 值 我們例子中的output 與真實值 例子中的y train 的不一致程度,它是乙個非負實值函式,損失函式越小,模型的魯棒性就越好。我們訓練模型的過程,就是通過不斷的迭代計算,使用梯度下降的優化演算法,使得損失函式越來越小。損失函式越小就表示...
pytorch 深度學習
pytorch深度學習實踐 訓練集 開發集 模型評估 測試集。f x wx b f x wx b f x w x bloss 乙個樣本 cost mean square error training set 區域性最優,不一定全域性最優。鞍點 梯度為0,但無法繼續迭代。w w c ost ww w ...