Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)塊的網(wǎng)絡(luò)之VGG
與芯片設(shè)計(jì)中工程師從放置晶體管到邏輯元件再到邏輯塊的過(guò)程類(lèi)似,神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)也逐漸變得更加抽象。研究人員開(kāi)始從單個(gè)神經(jīng)元的角度思考問(wèn)題,發(fā)展到整個(gè)層次,現(xiàn)在又轉(zhuǎn)向模塊,重復(fù)各層的模式。
使用塊的想法首先出現(xiàn)在牛津大學(xué)的視覺(jué)幾何組(visualgeometry Group)(VGG)的VGG網(wǎng)絡(luò)中。通過(guò)使用循環(huán)和子程序,可以很容易地在任何現(xiàn)代深度學(xué)習(xí)框架的代碼中實(shí)現(xiàn)這些重復(fù)的結(jié)構(gòu)。
VGG塊
經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)的基本組成部分是下面的這個(gè)序列:
1.帶填充以保持分辨率的卷積層
2.非線(xiàn)性激活函數(shù),如ReLU
3.匯聚層,如最大匯聚層
而一個(gè)VGG塊與之類(lèi)似,由一系列卷積層組成,后面再加上用于空間下采樣的最大匯聚層。
在最初的VGG論文中,作者使用了帶有 3 × 3卷積核、填充為1(保持高度和寬度)的卷積層,和帶有 2 × 2 池化窗口、步幅為2(每個(gè)塊后的分辨率減半)的最大匯聚層。
在下面的代碼中,我們定義了一個(gè)名為vgg_block的函數(shù)來(lái)實(shí)現(xiàn)VGG塊。
該函數(shù)有三個(gè)參數(shù),分別對(duì)應(yīng)于卷積層的數(shù)量num_convs、輸入通道的數(shù)量in_channels和輸出通道的數(shù)量out_channels。
import torch from torch import nn from d2l import torch as d2l def vgg_block(num_convs, in_channels, out_channels): layers = [] for _ in range(num_convs): layers.append(nn.Conv2d(in_channels, out_channels, kernel_size = 3, padding=1)) leyers.append(nn.ReLU()) in_channels = out_channels layers.append(nn.MaxPool2d(kernel_size=2, stride=2)) return nn.Sequential(*layers)
VGG網(wǎng)絡(luò)
與AlexNet、LeNet一樣,VGG網(wǎng)絡(luò)可以分為兩個(gè)部分:第一部分主要由卷積層和匯聚層組成,第二部分由全連接層組成。如下圖所示:
VGG神經(jīng)網(wǎng)絡(luò)連續(xù)連接上圖的幾個(gè)VGG塊(在vgg_block函數(shù)中定義)。其中有超參數(shù)變量conv_arch。該變量指定了每個(gè)VGG塊里的卷積層的個(gè)數(shù)和輸出通道數(shù)。全連接模塊則與AlexNet中的相同。
原始VGG網(wǎng)絡(luò)中有5個(gè)卷積塊,其中前兩個(gè)塊各有一個(gè)卷積層,后三個(gè)塊包含兩個(gè)卷積層。第一個(gè)模塊有64個(gè)輸出通道,每個(gè)后續(xù)模塊將輸出通道數(shù)量翻倍,直到數(shù)字達(dá)到512。由于該網(wǎng)絡(luò)使用8個(gè)卷積層和3個(gè)全連接層,因此它通常被稱(chēng)為VGG-11。
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))
下面的代碼實(shí)現(xiàn)了VGG-11??梢酝ㄟ^(guò)在conv_arch上執(zhí)行for循環(huán)來(lái)簡(jiǎn)單實(shí)現(xiàn)。
def vgg(conv_arch): conv_blks = [] in_channels = 1 # 卷積層部分 for (num_convs, out_channels) in conv_arch: conv_blks.append(vgg_block(num_convs, in_cannels, out_channels)) in_channels = out_channels return nn.Sequential( *conv_blks, nn.Flatten(), # 全連接層部分 nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5), nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5), nn.Linear(4096, 10) ) net = vgg(conv_arch)
接下來(lái),我們將構(gòu)建一個(gè)高度和寬度為224的單通道數(shù)據(jù)樣本,以觀察每個(gè)層輸出的形狀。
X = torch.randn(size=(1, 1, 224, 224)) for blk in net: X = blk(X) print(blk.__class__.__name__, 'output shape: \t', X.shape)
Sequential output shape: torch.Size([1, 64, 112, 112]) Sequential output shape: torch.Size([1, 128, 56, 56]) Sequential output shape: torch.Size([1, 256, 28, 28]) Sequential output shape: torch.Size([1, 512, 14, 14]) Sequential output shape: torch.Size([1, 512, 7, 7]) Flatten output shape: torch.Size([1, 25088]) Linear output shape: torch.Size([1, 4096]) ReLU output shape: torch.Size([1, 4096]) Dropout output shape: torch.Size([1, 4096]) Linear output shape: torch.Size([1, 4096]) ReLU output shape: torch.Size([1, 4096]) Dropout output shape: torch.Size([1, 4096]) Linear output shape: torch.Size([1, 10])
我們?cè)诿總€(gè)塊的高度和寬度減半,最終高度和寬度都為7。最后再展平表示,送入全連接層處理。
訓(xùn)練模型
由于VGG-11比AlexNet計(jì)算量更大,因此我們構(gòu)建了一個(gè)通道數(shù)較少的網(wǎng)絡(luò),足夠用于訓(xùn)練Fashion-MNIST數(shù)據(jù)集。
ratio = 4 small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch] net = vgg(small_conv_arch)
除了使用略高的學(xué)習(xí)率外,模型訓(xùn)練過(guò)程與AlexNet類(lèi)似。
lr, num_epochs, batch_size = 0.05, 10, 128 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224) d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.175, train axx 0.935, test acc 0.917 2559.6 examples/sec on cuda:0
以上就是Python神經(jīng)網(wǎng)絡(luò)塊的網(wǎng)絡(luò)之VGG深度學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Python神經(jīng)網(wǎng)絡(luò)VGG塊的網(wǎng)絡(luò)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python配置pip國(guó)內(nèi)鏡像源的實(shí)現(xiàn)
這篇文章主要介紹了Python配置pip國(guó)內(nèi)鏡像源的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python 獲取一個(gè)值在某個(gè)區(qū)間的指定倍數(shù)的值方法
今天小編就為大家分享一篇python 獲取一個(gè)值在某個(gè)區(qū)間的指定倍數(shù)的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11pyinstaller打包程序后閃退問(wèn)題的解決方法
這篇文章主要給大家介紹了關(guān)于pyinstaller打包程序后閃退問(wèn)題的解決方法,閃退原因可能有很多這里記錄下我遇到的問(wèn)題,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Python使用Matplotlib繪制三維散點(diǎn)圖詳解流程
matplotlib是基建立在python之上,適用于創(chuàng)建靜態(tài),動(dòng)畫(huà)和交互式可視化,通常與數(shù)據(jù)分析模塊pandas搭配使用,用于數(shù)據(jù)的分析和展示,適用于主流的操作系統(tǒng),如Linux、Win、Mac2022-11-11Python截圖的五個(gè)方法實(shí)例總結(jié)
學(xué)習(xí)一門(mén)語(yǔ)言最好的方法便是實(shí)踐,想要拿Python寫(xiě)一個(gè)截圖工具,下面這篇文章主要給大家介紹了關(guān)于Python截圖的五個(gè)方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Python實(shí)現(xiàn)將一個(gè)大文件按段落分隔為多個(gè)小文件的簡(jiǎn)單操作方法
這篇文章主要介紹了Python實(shí)現(xiàn)將一個(gè)大文件按段落分隔為多個(gè)小文件的簡(jiǎn)單操作方法,涉及Python針對(duì)文件的讀取、遍歷、轉(zhuǎn)換、寫(xiě)入等相關(guān)操作技巧,需要的朋友可以參考下2017-04-04