最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python機(jī)器學(xué)習(xí)從ResNet到DenseNet示例詳解

 更新時(shí)間:2021年10月11日 10:42:33   作者:Supre_yuan  
ResNet極大地改變了如何參數(shù)化深層網(wǎng)絡(luò)中函數(shù)的觀點(diǎn)。稠密連接網(wǎng)絡(luò)(DenseNet)在某種程度上是ResNet的邏輯擴(kuò)展。讓我們先從數(shù)學(xué)上了解下

從ResNet到DenseNet

在這里插入圖片描述

在這里插入圖片描述

上圖中,左邊是ResNet,右邊是DenseNet,它們?cè)诳鐚由系闹饕獏^(qū)別是:使用相加和使用連結(jié)。

在這里插入圖片描述

最后,將這些展開式結(jié)合到多層感知機(jī)中,再次減少特征的數(shù)量。實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單:我們不需要添加術(shù)語(yǔ),而是將它們連接起來(lái)。DenseNet這個(gè)名字由變量之間的“稠密連接”而得來(lái),最后一層與之前的所有層緊密相連。稠密連接如下圖所示:

在這里插入圖片描述

稠密網(wǎng)絡(luò)主要由2部分構(gòu)成:稠密塊(dense block)和過(guò)渡層(trainsition block)。

前者定義如何連接輸入和輸出,而后者則控制通道數(shù)量,使其不會(huì)太復(fù)雜。

稠密塊體

DenseNet使用了ResNet改良版的“批量歸一化、激活和卷積”結(jié)構(gòu)。我們首先實(shí)現(xiàn)下這個(gè)結(jié)構(gòu)。

import torch
from torch import nn
from d2l import torch as d2l

def conv_block(input_channels, num_channels):
	return nn.Sequential(
		nn.BatchNorm2d(input_channels), nn.ReLU(),
		nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1)
	)

一個(gè)稠密塊由多個(gè)卷積塊組成,每個(gè)卷積塊使用相同矢量的輸出通道。然而,在前向傳播中,我們將每個(gè)卷積塊的輸入和輸出在通道維上連結(jié)。

class DenseBlock(nn.Module):
	def __init__(self, num_convs, input_channels, num_channels):
		super(Denseblock, self).__init__()
		layer = []
		for i in range(num_convs):
			layer.append(conv_block(num_channels * i + input_channels, num_channels))
		self.net = nn.Sequential(*layer)

	def forward(self, X):
		for blk in self.net:
			Y = blk(X)
			# 連結(jié)通道維度上的每個(gè)塊的輸入和輸出
			X = torch.cat((X, Y), dim=1)
		return X

在下面的例子中,我們定義一個(gè)有2個(gè)輸出通道數(shù)為10的DenseBlock。使用通道數(shù)為3的輸入時(shí),我們會(huì)得到通道數(shù)為 3 + 2 × 10 = 23 3+2\times10=23 3+2×10=23的輸出。卷積塊的通道數(shù)控制了輸出通道數(shù)相對(duì)于輸入通道數(shù)的增長(zhǎng),因此也被稱為增長(zhǎng)率(growth rate)。

blk = DenseBlock(2, 3, 10)
X = torch.randn(4, 3, 8, 8)
Y = blk(X)
Y.shape
torch.Size([4, 23, 8, 8])

過(guò)渡層

由于每個(gè)稠密快都會(huì)帶來(lái)通道數(shù)的增加,使用過(guò)多則會(huì)過(guò)于復(fù)雜化模型。而過(guò)渡層可以用來(lái)控制模型復(fù)雜度。它通過(guò) 1×1卷積層來(lái)減小通道數(shù),并使用步幅為2的平均匯聚層減半高和寬,從而進(jìn)一步降低模型復(fù)雜度。

def transition_block(input_channels, num_channels):
	return nn.Sequential(
		nn.BatchNorm2d(input_channels), nn.ReLU(),
		nn.Conv2d(input_channels, num_channels, kernel_size=1)
		nn.AvgPool2d(kernel_size=2, stride=2)
	)

對(duì)上一個(gè)例子中稠密塊的輸出使用通道數(shù)為10的過(guò)渡層。此時(shí)輸出的通道數(shù)減為10,高和寬均減半。

blk = transition_block(23, 10)
blk(Y).shape
torch.Size([4, 10, 4, 4])

DenseNet模型

我們來(lái)構(gòu)造DenseNet模型。DenseNet首先使用同ResNet一樣的單卷積層和最大聚集層。

b1 = nn.Sequential(
	nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
	nn.BatchNorm2d(64), nn.ReLU(),
	nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
)

接下來(lái),類似于ResNet使用的4個(gè)殘差塊,DenseNet使用的是4個(gè)稠密塊。與ResNet類似,我們可以設(shè)置每個(gè)稠密塊使用多少個(gè)卷積層。這里我們?cè)O(shè)成4,從而與之前的ResNet-18保持一致。稠密塊里的卷積層通道數(shù)(即增長(zhǎng)率)設(shè)置為32,所以每個(gè)稠密塊將增加128個(gè)通道。

在每個(gè)模塊之間,ResNet通過(guò)步幅為2的殘差塊減小高和寬,而DenseNet則使用過(guò)渡層來(lái)減半高和寬,并減半通道數(shù)。

# 'num_channels'為當(dāng)前通道數(shù)
num_channels, growth_rate = 64, 32
num_convs_in_dense_blocks = [4, 4, 4, 4]
blks = []
for i, num_convs in enumerate(num_convs_in_dense_blocks):
	blks.append(DenseBlock(num_convs, num_channels, growth_rate))
	# 上一個(gè)稠密塊的輸出通道數(shù)
	num_channels += num_convs * growth_rate
	# 在稠密塊之間添加一個(gè)轉(zhuǎn)換層,使通道數(shù)量減半
	if i != len(num_convs_in_dense_blocks) - 1:
		blks.append(transition_block(num_channels, num_channels // 2))
		num_channels = num_channels // 2

與ResNet類似,最后接上全局匯聚層和全連接層來(lái)輸出結(jié)果。

net = nn.Sequential(
	b1, *blks,
	nn.BatchNorm2d(num_channels), nn.ReLU(),
	nn.AdaptiveMaxPool2d((1, 1)),
	nn.Flatten(),
	nn.Linear(num_channels, 10)
)

訓(xùn)練模型

由于這里使用了比較深的網(wǎng)絡(luò),本節(jié)里我們將輸入高和寬從224降到96來(lái)簡(jiǎn)化計(jì)算。

lr, num_epochs, batch_size = 0.1, 10, 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.154, train acc 0.943, test acc 0.880
5506.9 examples/sec on cuda:0

在這里插入圖片描述

以上就是Python機(jī)器學(xué)習(xí)從ResNet到DenseNet示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python機(jī)器學(xué)習(xí)ResNet到DenseNet的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于pytorch實(shí)現(xiàn)運(yùn)動(dòng)鞋品牌識(shí)別功能

    基于pytorch實(shí)現(xiàn)運(yùn)動(dòng)鞋品牌識(shí)別功能

    這篇文章主要給大家介紹了關(guān)于如何基于pytorch實(shí)現(xiàn)運(yùn)動(dòng)鞋品牌識(shí)別功能,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PyTorch具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2024-02-02
  • anaconda虛擬環(huán)境python?sklearn庫(kù)的安裝過(guò)程

    anaconda虛擬環(huán)境python?sklearn庫(kù)的安裝過(guò)程

    Anaconda是專注于數(shù)據(jù)分析的Python發(fā)行版本,包含了conda、Python等190多個(gè)科學(xué)包及其依賴項(xiàng),這篇文章主要給大家介紹了關(guān)于anaconda虛擬環(huán)境python?sklearn庫(kù)的安裝過(guò)程,需要的朋友可以參考下
    2023-11-11
  • pytorch 實(shí)現(xiàn)打印模型的參數(shù)值

    pytorch 實(shí)現(xiàn)打印模型的參數(shù)值

    今天小編就為大家分享一篇pytorch 實(shí)現(xiàn)打印模型的參數(shù)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python?sklearn庫(kù)三種常用編碼格式實(shí)例

    Python?sklearn庫(kù)三種常用編碼格式實(shí)例

    這篇文章主要為大家介紹了Python?sklearn庫(kù)三種常用編碼格式實(shí)例展示,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Python編輯和運(yùn)行的四種方式

    Python編輯和運(yùn)行的四種方式

    本篇內(nèi)容主要是講python在電腦上編輯和運(yùn)行的幾種不同方式,后面主要是在pycharm中去寫代碼,然后運(yùn)行,其實(shí)還有其他的方式可以在電腦上寫python代碼和運(yùn)行python代碼,需要的朋友可以參考下
    2024-08-08
  • python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令

    python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令

    這篇文章主要介紹了python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • 利用Python的Django框架中的ORM建立查詢API

    利用Python的Django框架中的ORM建立查詢API

    這篇文章主要介紹了利用Python的Django框架中的ORM建立查詢API,對(duì)Managers和QuerySets進(jìn)行了著重介紹,需要的朋友可以參考下
    2015-04-04
  • Python隨機(jī)驗(yàn)證碼生成和join?字符串的問(wèn)題解析

    Python隨機(jī)驗(yàn)證碼生成和join?字符串的問(wèn)題解析

    Python中有join()和os.path.join()兩個(gè)函數(shù),join是將字符串、元組、列表中的元素以指定的字符(分隔符)連接生成一個(gè)新的字符串而os.path.join():?將多個(gè)路徑組合后返回,本文給大家介紹的非常詳細(xì),需要的朋友一起看看吧
    2022-04-04
  • 一文帶你精通Python中*args和**kwargs的應(yīng)用技巧

    一文帶你精通Python中*args和**kwargs的應(yīng)用技巧

    如果能在Python中創(chuàng)建適應(yīng)不同場(chǎng)景的函數(shù),而無(wú)需每次都重寫它們,會(huì)使得操作簡(jiǎn)潔方便,這就是*args和**kwargs的魔力所在,下面我們就來(lái)看看它們的具體一些應(yīng)用技巧吧
    2024-03-03
  • Mac下PyCharm快捷鍵分享

    Mac下PyCharm快捷鍵分享

    這篇文章主要介紹了Mac下PyCharm快捷鍵,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

吴江市| 靖远县| 深州市| 高青县| 吴江市| 城步| 明星| 泾源县| 富平县| 济源市| 宁德市| 隆德县| 会昌县| 阿荣旗| 西充县| 鄂托克前旗| 呼伦贝尔市| 扶绥县| 玉屏| 建阳市| 沐川县| 崇文区| 会昌县| 都匀市| 大兴区| 武川县| 东明县| 宁远县| 察隅县| 汽车| 神池县| 鄂尔多斯市| 宁乡县| 衡南县| 大足县| 平武县| 延安市| 昌黎县| 崇文区| 嘉黎县| 台江县|