31 深度習 高階 全連線層和網路結構

Mondo 科技 更新 2024-01-30

嗨,你好。 我是茶桁架。

在上一堂課中,我們學習了習卷積和池化,那麼卷積是如何構成卷積神經網路的呢?讓我們在本課中討論它。

整個卷積的操作是通過卷積,然後通過池化,然後通過卷積。 會使圖形變得非常小。 然後經過池化之後,我們不斷地把我們的特徵做得越來越小,然後就有乙個非常重要的層,叫做全連線層。

接下來的幾個直方圖是它的線性變化,即它的全連線層。

首先,將卷積和池化做得更小,變成非常小的高階特徵,然後拉平,然後進入全連線層進行線性變化。 這就是卷積操作的整個工作流程,以及為什麼卷積操作需要更少的引數。

在這裡,我們將重點介紹全連線層。

我們已經做了很多池化工作,經過大量的卷積處理後,我們將生成乙個非常厚的值。 將值展平得非常厚,要麼直接在 pytorch 中展平它,要麼使用 reshape 將其展平為 n 的 1 倍向量。 然後將這個 1 乘以 n 以熟悉wx+b

我們對它進行線性更改,首先,我們更改它的尺寸。 假設您想給它乙個 10 分類,緯度會改變。

另一方面,每一層都會有不同的特徵點,這些特徵點代表影象從不同位置抽象出的值。 然後逐層,它是不同過濾器的結果,提取出不同的特徵。 如水平、垂直等。 機器還可以自動提取一些顏色、形狀等。

所以現在我們必須綜合考慮所有這些事情,我們必須把所有這些資訊放在一起,做出全面的判斷。 例如,我們有三個過濾器,這意味著我們有三層,這三層中有四個位置。 然後,展平的繪畫變為 3 乘以 4,它有 12 個值。 這 12 個值以不同的方式提取,具有不同的關注點,並提出了 12 個高階特徵。

現在有必要將這12個高階特徵作為乙個整體和全面地考慮。 我們將給這些資料乙個不同的權重。 我要為它做乙個wi * xi,並為其這些整體綜合進行了加權分配。

因此,全連線層不僅改變了維度,而且還綜合了之前提取的區域性資訊,這就是全連線層的作用。 對變化和維度資訊進行了綜合。

那麼,讓我們來看看。

百家助企 這些不同的知名網路結構都是在過程完成後線性變化的,線性變化之後,就會變成我們期望的目標,也就是合成這些東西中的第乙個。

計算出此值後,將按全連線層對其進行分類。 但是,全連線層不一定只是分類,而且在特徵上也發生了變化。

線性變化完成後,您可以使用 softmax 和交叉熵來找到其損失值。

其實這幾年,從2024年左右開始,其實大家已經慢慢停止使用softmax和交叉熵了,當然也可以用這個。 為什麼不使用它呢?

例如,我現在有三個 **,image1、image2 和 image3,對應的標籤分別是。所以當你想做交叉熵時,你必須把 3 變成,然後必須更改 5 和 6。 然後,你可以用softmax**做交叉熵,而不是這個概率。 也就是說,這裡有乙個獨熱編碼。 結果,事實證明,可以進行簡化的操作,並在softmax之後向其新增日誌。

比方說,softmax 在那之後給它新增乙個日誌,它將是乙個負數且相對較大的數字,越接近 1,例如 099,越接近 1,結果將更接近 0,離 1 越遠,這個負值就越大。

所以現在你有乙個名為 log softmax 的非線性變化,結果是負的。 然後有一種損失叫做nlllossnegative log likelihood loss這在 pytorch 中也可用。

這就是有趣的部分,如果我們的標籤是 3,讓我們看看日誌後面的值是否不是,給它乙個減號,然後就說這個的損失是。如果它的標籤是 5,那麼日誌後面跟著另乙個值,我們說是,那麼需要 5 個,我們發現結果是,加乙個減號,其損失直接

這消除了對一熱編碼的需要,並且還實現了我們希望它越接近 1,損失就越接近 0 的效果。

所以,現在在我們的工作中,我們看到大量的**已經開始這樣做了,這相當於乙個簡化板的softmax。

所以這就是我們整個卷積神經網路的工作流程,大家一定都知道全連線層的作用。

好的,讓我們做乙個總結。 在第一課中,我將解釋卷積的原理。 那麼什麼是卷積神經網路呢?只要你使用卷積(conv)作為網路,它就被稱為卷積神經網路。 所以從理論上講,你可以讓乙個圖經歷卷積,然後通過RNN,然後通過卷積,然後通過RNN,這很好。 您可以將其稱為卷積網路或遞迴神經網路。

然後我告訴大家,CNN可以用在很多地方,比如分類、檢測、分割,但實際上卷積神經網路在背後做。

我還談到了濾鏡、填充、步幅和通道,以及它們的作用。 除此之外,我們還討論了引數共享和位置不變性。

在整個過程中,我們哪一層做卷積,哪一層做池化,有多少層做線性變化,是不是純粹憑經驗?說白了,這確實純粹是憑經驗,所以有乙個很重要的特點需要我們借鑑,需要借鑑前人的經驗。

我們需要看看前輩的網路結構是如何構建的,有幾個重要的結構,le-net5,alex-net。 Alex 的網路結構是 imagenet 在 2012 年獲得的第一名,上面有一張圖片。

它的特點是第一次用Relu做非線性變化,效果會更快,也會在GPU上計算。

relu 是非線性變化,如果你做乙個卷積運算,給它加上乙個 relu,你可以對它的數值進行非線性變化,即它的卷積結果是非線性變化。

GPU 計算的作用是什麼?為什麼 GPU 很重要?

假設有乙個 10,000 * 10,000 的圖,有乙個 3 * 3 的卷積核,如果我們談論原始狀態,我們必須從左到右,然後從上到下進行。 我們必須做 998 次 998 次移動。

如果我們有乙個 GPU,我們可以讓其中的一部分在 GPU 的一部分中計算,同時在 GPU 的另一部分中計算另一部分,以便它可以被分發。 因為GPU所做的是使矩陣運算可以分布在不同的地方並行化。

這就是為什麼有些 GPU 不會卡在玩遊戲的原因,因為當你載入**時,它的一部分載入到 GPU 的某個地方,另一部分載入到 GPU 的另一部分,它們同時載入在一起。

如果你已經30多歲了,你應該知道,以前看網頁的時候,大**會一行一行地顯示,而在90年代末,**是一行一行地顯示出來的。 對於 GPU,顯示 ** 是逐個渲染的。

因此,對於卷積神經網路,每個片段的濾波器也是一起渲染和計算的。 因此,當您進行一層計算時,速度會更快。 如果你有足夠的GPU,你也可以讓每一層的過濾器平行計算。 可以快速計算每塊每層的過濾器。

所以有了GPU,執行速度可以快十倍、二十倍,甚至上百倍。

然後是 vgg-net。

VGG-net是第乙個真正的深度神經網路,如果我們看一下這張圖,它已經在門級進行了下取樣。 連續下取樣的結果是可以獲得一些非常深的特徵,或者一些非常高階的特徵。

VGG當時取得的成績也很好,我學得很好。 但是當VGG正式把我們帶到深度神經網路時,我們發現當網路非常深的時候,就出現了問題。

讓我們回想一下,在上一課中,當網際網絡很深時會出現什麼問題

正如我們在上一課中所說,當網路非常深時,梯度會消失。

當第一次進行這種改變時,並不是說它會消失,而是與漸變消失非常相似。 就是這個**在前面跑得很長,如果這個過濾器有幾個比較小的值,那麼這個值在過濾器之後會變得很小,然後經過乙個過濾器之後就會變得非常小。

最後,原始影象大相徑庭,經過幾次卷積,就變成了乙個小數字,呈現出幾乎純色**。

其實,這也可以從哲學上理解,當你的抽象水平非常高時,全世界的一切都是一樣的。 是的,這是非常佛教的,科學的終結是神學。 當你的抽象水平非常高時,你會看到世界上的一切都是一樣的,在CNN中也是一樣的,當你的東西足夠長時,你最終會得到幾乎相同的東西。

因此,為了解決這個問題,提出了一種重要的神經網路res-net。

這就是所謂的殘差網路,這個殘差網路非常重要,這是當年Microsoft亞洲研究所提出的。

2024年,計算機視覺的識別率超過了人眼,因此2024年是AI開始在行業中落地的第一年。

當然,它的原理並不難,但是經過這樣的修改,我們的計算機可以比人類更準確地識別網路,然後開始這個行業。

螢幕截圖中是 res-net 塊。

class resblock(nn.module):

def forward(self,x):

out = self.conv(x)

out = self.batch_normal(out)

out = torch.relu(out)

return out + x

當你進行前向運算時,你輸入x,經過卷積,然後你給它乙個批量歸一化,它的值會從小變大,再大變小。 然後進行 relu 非線性更改,輸出帶有 x。

這句話就是我們說的殘差,也就是說,理論上我們只需要輸出出來,但為什麼要加x呢?因為經過多層,out 可能會變成 0 並成為純色**。 所以新增 x 意味著它仍然保留了它的主要 ** 資訊,但它在 out 中有一些小的變化。 這就是res-net的工作原理。

如果我們現在想做乙個深度的res-net怎麼辦?你給它乙個三維的**,比方說 32 個過濾器。

然後我們做了乙個 resblock:

class netresdeep(nn.module):

def __init__(

self.resblocks = nn.sequential(

resblock(n_chans=n_chans) for _ in range(n_blocks)]

這個地方其實相當於resblock之後的輸出x+out我把它喂進了乙個 resblock,另乙個x+out我們到了sequential這意味著完成此操作後,其輸出將直接輸出到下乙個。

在這個過程中,讓 x 進來做卷積、非線性變化和池化。 然後將其傳送到 resblock 字串:

class netresdeep(..

def forward(self, x):

out = f.max_pool2d(torch.relu(self.conv(x)),2)

out = self.resblocks(out)

out = f.max_pool2d(out, 2)

out = out.view(-1, 8 * 8 * self.n_chans)

out = torch.relu(self.fc1(out))

out = self.fc2(out)

這串resblocks,它有很多resblock,它一層又一層地執行。 之後,我做了乙個池化,然後我做了乙個調平,調平之後,我做了乙個全連線,就是權重的線性變化,然後在變化之後加上乙個非線性的變化,最後做了乙個線性變化。

這裡fc2我們將維度定義為 10,這意味著它將是乙個 10 類任務。

然後我們可以做乙個對數softmax,或交叉熵,或nll,給它反向傳播。

這整個過程就是我們的研究網路。

只要網路有 resblock,或者類似 resblock 的東西,它就被稱為 res-net。 就像具有卷積單元的網路稱為卷積網路一樣。

這句話的意思是res-net有很多種。 例如,下圖是乙個非常有名的 res-net。

我們剛才寫的 resblock 是最簡單的 resblock,這個 resblock 是在 x 進來之後,有乙個卷積,然後對它進行批量歸一化,然後歸一化後執行乙個 relu,然後執行乙個 dropout,然後對它執行乙個 relu,然後求和, 並新增 x。

這是我們剛剛編寫的 resblock 的更複雜版本。 這種網路結構是res-net的經典結構。

res-net 有幾種經典結構:resnet-18、resnet-34、resnet-50、resnet-101 和 resnet-152。 resnet-18 和 resnet-34 的基本結構相同,屬於較淺的網路,而後三種型別的基本結構與 resnet-18 和 resnet-34 不同,屬於較深的網路。

如果你有興趣,可以看看這個**:

這五種結構都可以實現,但它們的實現方式不同。

從理論上講,res-net都是卷積,沒有完整的鏈結。 完全連線的部分實際上放置在外部。

res-net的實現過程包含了一些工程方面的東西,如果你想做計算機視覺,你需要考慮學習這部分的習。 稍後,我將有乙個專門介紹簡歷的部分,將對此進行更詳細的解釋。

然後讓我們看乙個初始模型,它從字面上稱為啟動模型,通常稱為初始模型。 這是谷歌在res-net提出後提出的乙個神經網路。

關於谷歌神經網路提出的啟動機制,乙個非常奇怪的事情是,它提出了乙個名為1*1 convolutional,這意味著我們採用了之前的卷積運算kernel_size它變成 1*1,也就是變成乙個點。 它變成乙個點,然後新增乙個非線性變化。

這個權重一開始也是隨機的,然後就是習。

這相當於將整個前圖(每個數字乘以乙個數字),然後給它乙個非線性變化。

也就是說,如圖位置是 5,相當於將前乙個矩陣中的所有數字乘以 5,然後進行非線性變化。

假設現在有乙個**,包括RGB是,現在有5個,那麼結果應該是什麼?

如圖所示,即如果a為5,那麼b、c、d應該等於什麼?分別應該是

那麼它到底是做什麼的呢?首先,我們知道第乙個功能是改變通道數。

更改通道數後,如果是這種開始的機制是使用多個不同核心大小的卷積作為每一層的輸入,然後將這些值放在一起,並將它們用作下一層的輸出。

這時,填充非常有用,可以確保值都在那裡,你可以連線它,否則做各種修復會很麻煩。

inception 的第乙個操作是它有乙個 1 * 1,除了改變通道數之外什麼都不做,第二個操作是它使用多個核心大小來卷積乙個層,然後連線所有結果。

然後將它們全部連線起來,就會產生這樣的結果。

正如我剛才所說,Inception 會連線多個核心大小的結果,因為核心大小有很多,而且這個結果很長,我們想讓它更短,以便可以使用它此操作使其更短。

使用了 16 個您可以將這個 256 層通道變成 16 層通道,然後在它變成 16 層後使用它卷積核去得到了乙個渠道。

如果你直接使用它如果你拍拍,你也可以得到乙個通道,但兩者之間是有區別的。 如果直接使用,則為頻道,有 32 個。 那麼需要擬合的引數是 1.6 億。

引數之所以大,是因為連線在一起的值非常大,非常深。 現在,如果你想讓它更淺,引數就更少了。 這就是所謂的瓶頸網路。 也就是說,將之前連線的、特別長的通道做得很短,然後在這個短通道上做計算,消耗的引數只有1300萬。

所以事實上,由於啟動機制,它會產生很長的結果。 如果我們想對這個結果進行長時間的卷積,我們將需要很多引數,我們可以傳遞它讓它更短,然後捲曲它,它的重量要輕得多。 這就是植入機制。

因此,ineption還是一樣的,減少引數的數量,減少引數的數量,降低模型的複雜度,減少過擬合,加快計算速度。

這基本上就是我們卷積神經網路的終點。 更多卷積神經應用將在後面討論 CV 特定方面。

相關問題答案

    28 種高階 LSTM 習 深度學習

    如果您對本文中的資源和內容有任何疑問,請給我留言。嗨,你好。我是茶桁架。在上一課中,我們用了乙個例子來說明為什麼我們使用 RNN 神經網路,以及它與全連線神經網路的區別。在這一課中,我們將繼續討論上一課的內容,如果你還沒有看過上一課,建議回去好好看一看,尤其是要弄清楚 的流程順序。乙個全連線的模型必...

    30 深度 習 高階池化

    嗨,你好。我是茶桁架。在上一課中,我們習詳細學習了卷積原理,在這個過程中,我們談到了乙個更重要的概念,叫做input channel和output channel 當然,沒有必要直接實現,卷積 pytorch tensorflow 等原理,其實已經實現了。但是,如果我們現在使用 Pytorch 的卷...

    如何培養深入學習習的能力

    在資訊時代,深度學習習能力已成為一項極其重要的技能。無論您是學生 專業人士還是任何領域的從業者,您都將從發展深厚的 習 技能中受益匪淺。本文將解釋如何培養深度學習習技能,以幫助您在習,工作和生活中更加成功。要培養深入學習習的能力,首先需要打下堅實的基礎。這包括對自己領域的深刻理解,以及相關背景知識的...

    PyTorch 深度學習 習 框架揭開神秘面紗,掌握技術的未來!

    ...

    我學會了習 3 1,訓練後改變了

    我是陳剛,我是程式設計師,我是 的 學生習 月日報道,我寫的是這幾天我習和培訓的變化。通過這幾天的習和訓練,我明顯感受到了自己講話的變化,沒有以前那麼急了。我以前說話很焦急,語速很快,別人聽不見我在說什麼,所以經常在別人面前尷尬。這幾天,我學會了習和訓練,特別是 教會了我居中,定心訓練讓我更深的感受...