日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[pytorch、学习] - 5.7 使用重复元素的网络(VGG)

發(fā)布時(shí)間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [pytorch、学习] - 5.7 使用重复元素的网络(VGG) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考

5.7 使用重復(fù)元素的網(wǎng)絡(luò)(VGG)

AlexNet在LeNet的基礎(chǔ)上增加了3個(gè)卷積層。但AlexNet作者對(duì)它們的卷積窗口、輸出通道數(shù)和構(gòu)造順序均做了大量的調(diào)整。雖然AlexNet指明了深度卷積神經(jīng)網(wǎng)絡(luò)可以取得出色的結(jié)果,但并沒有提供簡單的規(guī)則以指導(dǎo)后來的研究者如何設(shè)計(jì)新的網(wǎng)絡(luò)。我們將在本章的后續(xù)幾節(jié)里介紹幾種不同的深度網(wǎng)絡(luò)設(shè)計(jì)思路。

下面介紹VGG

5.7.1 VGG塊

VGG塊的組成規(guī)律是:連續(xù)使用數(shù)個(gè)相同的填充為1、窗口形狀為3×3的卷積層后接上一個(gè)步幅為2、窗口形狀為2×2的最大池化層。卷積層保持輸入的高和寬不變,而池化層則對(duì)其減半。我們使用vgg_block函數(shù)來實(shí)現(xiàn)這個(gè)基礎(chǔ)的VGG塊,它可以指定卷積層的數(shù)量和輸入輸出通道數(shù)。

import time import torch from torch import nn, optimimport sys sys.path.append("..") import d2lzh_pytorch as d2l device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')def vgg_block(num_convs, in_channels, out_channels):blk = []for i in range(num_convs):if i == 0:blk.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))else:blk.append(nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1))blk.append(nn.ReLU())blk.append(nn.MaxPool2d(kernel_size=2, stride=2)) # 這里會(huì)使寬高減半return nn.Sequential(*blk)

5.7.2 VGG網(wǎng)絡(luò)

與AlexNet和LeNet一樣,VGG網(wǎng)絡(luò)由卷積層模塊后接全連接層模塊構(gòu)成。卷積層模塊串聯(lián)數(shù)個(gè)vgg_block,其超參數(shù)由變量conv_arch定義。該變量指定了每個(gè)VGG塊里卷積層個(gè)數(shù)和輸入輸出通道數(shù)。全連接模塊則跟AlexNet中的一樣。

現(xiàn)在我們構(gòu)造一個(gè)VGG網(wǎng)絡(luò)。它有5個(gè)卷積塊,前2塊使用單卷積層,而后3塊使用雙卷積層。第一塊的輸入輸出通道分別是1和64,之后每次對(duì)輸出通道數(shù)翻倍,直到變?yōu)?12。因?yàn)檫@個(gè)網(wǎng)絡(luò)使用了8個(gè)卷積層和3個(gè)全連接層,所以經(jīng)常被稱為VGG-11。

conv_arch = ((1, 1, 64), (1, 64, 128), (2, 128, 256), (2, 256, 512), (2, 512, 512)) # 經(jīng)過5個(gè) vgg_block, 寬高會(huì)減半5次, 變成 224/32 = 7 fc_features = 512 * 7 * 7 fc_hidden_units = 4096 # 任意

下面實(shí)現(xiàn)VGG-11

def vgg(conv_arch, fc_features, fc_hidden_units=4096):net = nn.Sequential()# 卷積層部分# conv_arch: ((1,1,64),(1,64,128),(2,128,256),(2,256,512),(2,512,512))for i, (num_convs, in_channels, out_channels) in enumerate(conv_arch):# 每經(jīng)過一個(gè)vgg_block都會(huì)使寬高減半"""(1,1,64):- 0: nn.Conv2d(1, 64, kernel_size=3, padding=1) # (1, 1, 224, 224) -> (1, 64, 224, 224)nn.MaxPool2d(kernel_size=2, stride=2) # (1, 64, 224, 224) -> (1, 64, 112, 112)(1,64,128):- 0: nn.Conv2d(64, 128, kernel_size=3, padding=1) # (1, 64, 112, 112) -> (1, 128, 112, 112)nn.MaxPool2d(kernel_size=2, stride=2) # (1, 128, 112, 112) -> (1, 128, 56, 56)(2,128,256):- 0: nn.Conv2d(128, 256, kernel_size=3, padding=1) # (1, 128, 56, 56) -> (1, 256, 56, 56)- 1: nn.Conv2d(256, 256, kernel_size=3, padding=1)nn.MaxPool2d(kernel_size=2, stride=2) # (1, 256, 56, 56) -> (1, 256, 28, 28)(2,256,512):- 0: nn.Conv2d(256, 512, kernel_size=3, padding=1) # (1, 256, 28, 28) -> (1, 512, 28, 28)- 1: nn.Conv2d(512, 512, kernel_size=3, padding=1)nn.MaxPool2d(kernel_size=2, stride=2) # (1, 512, 28, 28) -> (1, 512, 14, 14)(2,512,512):- 0: nn.Conv2d(512, 512, kernel_size=3, padding=1)- 1: nn.Conv2d(512, 512, kernel_size=3, padding=1)nn.MaxPool2d(kernel_size=2, stride=2) # (1, 512, 14, 14) -> (1, 512, 7, 7)"""net.add_module("vgg_block_" + str(i+1), vgg_block(num_convs, in_channels, out_channels))# 全連接層部分net.add_module("fc", nn.Sequential(d2l.FlattenLayer(),nn.Linear(fc_features, fc_hidden_units),nn.ReLU(),nn.Dropout(0.5),nn.Linear(fc_hidden_units, fc_hidden_units),nn.ReLU(),nn.Dropout(0.5),nn.Linear(fc_hidden_units, 10)))return net net = vgg(conv_arch, fc_features, fc_hidden_units) print(net)# X = torch.rand(1, 1, 224, 224)# for name, blk in net.named_children(): # X = blk(X) # print(name, "output shape: ", X.shape)

5.7.3 獲取數(shù)據(jù)和訓(xùn)練模型

ratio = 8 small_conv_arch = [(1, 1, 64//ratio), (1, 64//ratio, 128//ratio), (2, 128//ratio, 256//ratio), (2, 256//ratio, 512//ratio), (2, 512//ratio, 512//ratio)] net = vgg(small_conv_arch, fc_features // ratio, fc_hidden_units // ratio)print(net)

batch_size = 64 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)lr, num_epochs = 0.001, 5 optimizer = torch.optim.Adam(net.parameters(), lr=lr) d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)

總結(jié)

以上是生活随笔為你收集整理的[pytorch、学习] - 5.7 使用重复元素的网络(VGG)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。