日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

卷积神经网络补充—GoogleNet

發(fā)布時(shí)間:2025/4/5 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卷积神经网络补充—GoogleNet 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

復(fù)雜神經(jīng)網(wǎng)絡(luò)的問(wèn)題

簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)

我們注意這樣的一個(gè)問(wèn)題,我們?cè)谥暗膶W(xué)習(xí)當(dāng)中使用的都是簡(jiǎn)單的一條龍走下來(lái)的方式進(jìn)行學(xué)習(xí),這種是比較基礎(chǔ)的,沒(méi)有分叉,沒(méi)有循環(huán),就是一條路走完。可以看到之前學(xué)的都是特別簡(jiǎn)單的串行結(jié)構(gòu)。

GoogleNet

是一種基礎(chǔ)架構(gòu),我們一般拿這個(gè)網(wǎng)絡(luò)做一個(gè)主干網(wǎng)絡(luò),之后再在主干網(wǎng)絡(luò)上進(jìn)行修改之后作為我們實(shí)際應(yīng)用的場(chǎng)景。

減少代碼冗余:Inception Module

減少代碼冗余看起來(lái)比較陌生其實(shí)我們可能已經(jīng)默默應(yīng)用了很久了,例如:在面向過(guò)程的編程語(yǔ)言當(dāng)中使用函數(shù),在面向過(guò)程的編程語(yǔ)言當(dāng)中使用類。都是對(duì)代碼進(jìn)行減少冗余。
可以看到這種網(wǎng)絡(luò)結(jié)構(gòu)是十分的復(fù)雜,那么我們?nèi)绻恳稽c(diǎn)一點(diǎn)的寫完,那么這個(gè)代碼的復(fù)雜度就太大了。所以我們必須選擇減少代碼的冗余:

可以看到其實(shí)代碼當(dāng)中可復(fù)用的部分還是很多的,如上圖:
這個(gè)塊就被叫做:Inception(和電影盜夢(mèng)空間重名)具體如下:

這里的設(shè)計(jì)靈感來(lái)自于,在模式識(shí)別的過(guò)程當(dāng)中,主要是一些超參數(shù)的選擇不好處理,例如我們?cè)谶M(jìn)行卷積的時(shí)候,我們?cè)撨x擇卷積核的維數(shù)為多少的問(wèn)題。這樣我們?cè)O(shè)計(jì)為多個(gè)不同的路徑達(dá)到結(jié)果,這樣子在不斷的學(xué)習(xí)過(guò)程中,適合的卷積核所在的路徑就會(huì)被逐漸的凸顯出來(lái)。自動(dòng)幫我們選擇一個(gè)超參數(shù)。
那么這里

1×1的卷積到底是為了什么?

也就是這個(gè)圖里的1×1卷積到底是在做什么?

如果我們這個(gè)channel數(shù)是一個(gè)1那么什么也別說(shuō)了,這不就是一個(gè)矩陣數(shù)乘嗎?

但是我們大部分實(shí)際應(yīng)用的過(guò)程中channel并不是1而是多個(gè),例如三個(gè):

通過(guò)這個(gè)圖我們可以看到,其實(shí)卷積是一個(gè)對(duì)不同通道數(shù)據(jù)的一個(gè)融合,融合這個(gè)說(shuō)法比較空,不如舉一個(gè)例子來(lái)理解一下:我們上高中的時(shí)候經(jīng)常有個(gè)模考,或者月考。如果有六個(gè)科目,那么就是一個(gè)六維空間,在一個(gè)六維空間很難比較兩個(gè)同學(xué)誰(shuí)學(xué)習(xí)的情況更好,所以學(xué)校就有一個(gè)信息融合的算法,就是加總分。

當(dāng)然這里是融合為一個(gè)通道,如果我們多幾組卷積核,我們可以融合出目標(biāo)個(gè)通道數(shù)的數(shù)據(jù)形式。這個(gè)過(guò)程中一個(gè)顯著的特點(diǎn)就是改變了channel的個(gè)數(shù)。
可是改變一個(gè)channel的個(gè)數(shù)又有什么作用呢?我們可以詳細(xì)看下圖:

從圖里我們可以看到在經(jīng)過(guò)1×1卷積channel下降之后再進(jìn)行5×5卷積可以有效地節(jié)約運(yùn)算次數(shù),這就是在節(jié)約錢啊。

Concatenate是什么?

也就是這個(gè)東西是什么?

這個(gè)東西其實(shí)是將之前的內(nèi)容拆分,再在這一層結(jié)束之后從新合并在一起,我們注意一下這里的合并是在什么情況下合并的,這里的合并是依據(jù)channel合并的,也就是channel之下的全部?jī)?nèi)容都必須全部相等,才能順利合并。
所以我們?cè)谥虚g過(guò)程的卷積過(guò)程當(dāng)中要注意保證weight和height的穩(wěn)定不變。

實(shí)現(xiàn)Googlenet

代碼實(shí)現(xiàn)

import torch import numpy from torchvision import functional as F#這里我們注意不論我們輸入的通道數(shù)是多少,我們輸出的通道數(shù)都是88. class Inception_Model(torch.nn.Module):def __init__(self,input_channel):super(Inception_Model,self).__init__()self.poolingbranch= torch.nn.Conv2d(input_channel,24,kernel_size=1)self.1m1branch =torch.nn.Conv2d(input_channel,16,kernel_size=1)self.5m5branch1 =torch.nn.Conv2d(input_channel,16,kernel_size=1)self.5m5branch2=torch.nn.Conv2d(16,24,kernel_size=5,padding=2)#注意這里設(shè)置一個(gè)2的padding是為了保證輸出的圖形的形狀一致self.3m3branch1=torch.nn.Conv2d(input_channel,16,kernel_size=1)self.3m3branch2=torch.nn.Conv2d(16,24,kernel_size=3,padding=1)#同樣這里的padding也是為了保證輸出的圖像一致self.3m3branch3 =torch.nn.Conv2d(24,24,kernel_size=3,padding=1)def forward(self,x):branchpool=F.avg_pool2d(x,kernel_size=3,stride=1,padding=1)#這里是使用一個(gè)函數(shù),因?yàn)檫@個(gè)求平均沒(méi)有參數(shù),所以直接可以當(dāng)成函數(shù)使用branchpool=poolingbranch(branchpool)branch1m1=self.1m1branch(x)branch5m5=self.5m5branch1(x)branch5m5=self.5m5branch2(branch5m5)branch3m3=self.3m3branch1(x)branch3m3=self.3m3branch2(branch3m3)branch5m5=self.3m3branch3(branch3m3)outputs = [branchpool,branch1m1,branch5m5,branch3m3]#注意這里我們只是將其放在一個(gè)元組當(dāng)中,并沒(méi)有拼起來(lái)return torch.cat(outputs,dim=1)#正著開(kāi)始的第一號(hào)維度其實(shí)是第二個(gè)嘛,不就是channel嗎。只有當(dāng)只有channel不一樣的時(shí)候,才可以順利合并起來(lái)。class Net(torch.nn.Module):def __init__(self):super(Net,self).__init__()self.conv1=torch.nn.Conv2d(1,10,kernel_size=5)self.conv2=torch.nn.Conv2d(88,20,kernel_size=5)self.incip1=Inception_Model(10)self.incip2=Inception_Model(20)self.mp=torch.nn.MaxPool2d(2)self.fullconnect=nn=(1408,10)#這里我們注意,我們的1408是可以算出來(lái)的。#但是實(shí)際上并沒(méi)有人去算,都是輸入一個(gè)數(shù)據(jù)測(cè)試一下到底是多少的情況。def forward(self,x):in_size=x.size(0)#注意這里我們其實(shí)是為了獲得我們是在使用的數(shù)據(jù)集的大小的問(wèn)題x=F.relu(self.mp(self.conv1(x)))#從(1,28,28)到(10,24,24)再到(10,12,12)x=self.incip1(x)#從(10,12,12)到(88,12,12)x=f.relu(self.mp(self.conv2(x)))#從(88,12,12)到(10,8,8)再到(10,4,4)x=self.incip2(x)#從(10,4,4)到(88,4,4)所以一個(gè)輸出轉(zhuǎn)化為一個(gè)一維張量就成了1408了x=x.view(in_size,-1)#注意這里我們是將數(shù)據(jù)集中的,每一個(gè)數(shù)據(jù),原來(lái)的矩陣換成一個(gè)行。x=self.fullconnect(x)return x

在MNIST數(shù)據(jù)集上的表現(xiàn)



你看這里其實(shí)經(jīng)過(guò)幾次訓(xùn)練之后,這個(gè)測(cè)試集的準(zhǔn)確度就開(kāi)始下降了,這時(shí)候,可能就是出現(xiàn)了過(guò)擬合的現(xiàn)象。已經(jīng)達(dá)到了這種網(wǎng)絡(luò)的極限。理論上我們需要畫圖來(lái)找到最大值。但是一般我們?cè)趯?shí)際的操作當(dāng)中我們是每次達(dá)到新的高度就進(jìn)行一次存盤。最后我們得到的就是一個(gè)最好的模型了。

總結(jié)

以上是生活随笔為你收集整理的卷积神经网络补充—GoogleNet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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