導航:首頁 > 編程大全 > 卷積神經網路圖示

卷積神經網路圖示

發布時間:2022-12-31 00:35:34

A. 一文看懂四種基本的神經網路架構

原文鏈接:
http://blackblog.tech/2018/02/23/Eight-Neural-Network/

更多干貨就在我的個人博客 http://blackblog.tech 歡迎關注

剛剛入門神經網路,往往會對眾多的神經網路架構感到困惑,神經網路看起來復雜多樣,但是這么多架構無非也就是三類,前饋神經網路,循環網路,對稱連接網路,本文將介紹四種常見的神經網路,分別是CNN,RNN,DBN,GAN。通過這四種基本的神經網路架構,我們來對神經網路進行一定的了解。

神經網路是機器學習中的一種模型,是一種模仿動物神經網路行為特徵,進行分布式並行信息處理的演算法數學模型。這種網路依靠系統的復雜程度,通過調整內部大量節點之間相互連接的關系,從而達到處理信息的目的。
一般來說,神經網路的架構可以分為三類:

前饋神經網路:
這是實際應用中最常見的神經網路類型。第一層是輸入,最後一層是輸出。如果有多個隱藏層,我們稱之為「深度」神經網路。他們計算出一系列改變樣本相似性的變換。各層神經元的活動是前一層活動的非線性函數。

循環網路:
循環網路在他們的連接圖中定向了循環,這意味著你可以按照箭頭回到你開始的地方。他們可以有復雜的動態,使其很難訓練。他們更具有生物真實性。
循環網路的目的使用來處理序列數據。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。
循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。

對稱連接網路:
對稱連接網路有點像循環網路,但是單元之間的連接是對稱的(它們在兩個方向上權重相同)。比起循環網路,對稱連接網路更容易分析。這個網路中有更多的限制,因為它們遵守能量函數定律。沒有隱藏單元的對稱連接網路被稱為「Hopfield 網路」。有隱藏單元的對稱連接的網路被稱為玻爾茲曼機。

其實之前的帖子講過一些關於感知機的內容,這里再復述一下。
首先還是這張圖
這是一個M-P神經元

一個神經元有n個輸入,每一個輸入對應一個權值w,神經元內會對輸入與權重做乘法後求和,求和的結果與偏置做差,最終將結果放入激活函數中,由激活函數給出最後的輸出,輸出往往是二進制的,0 狀態代表抑制,1 狀態代表激活。

可以把感知機看作是 n 維實例空間中的超平面決策面,對於超平面一側的樣本,感知器輸出 1,對於另一側的實例輸出 0,這個決策超平面方程是 w⋅x=0。 那些可以被某一個超平面分割的正反樣例集合稱為線性可分(linearly separable)樣例集合,它們就可以使用圖中的感知機表示。
與、或、非問題都是線性可分的問題,使用一個有兩輸入的感知機能容易地表示,而異或並不是一個線性可分的問題,所以使用單層感知機是不行的,這時候就要使用多層感知機來解決疑惑問題了。

如果我們要訓練一個感知機,應該怎麼辦呢?
我們會從隨機的權值開始,反復地應用這個感知機到每個訓練樣例,只要它誤分類樣例就修改感知機的權值。重復這個過程,直到感知機正確分類所有的樣例。每一步根據感知機訓練法則來修改權值,也就是修改與輸入 xi 對應的權 wi,法則如下:

這里 t 是當前訓練樣例的目標輸出,o 是感知機的輸出,η 是一個正的常數稱為學習速率。學習速率的作用是緩和每一步調整權的程度,它通常被設為一個小的數值(例如 0.1),而且有時會使其隨著權調整次數的增加而衰減。

多層感知機,或者說是多層神經網路無非就是在輸入層與輸出層之間加了多個隱藏層而已,後續的CNN,DBN等神經網路只不過是將重新設計了每一層的類型。感知機可以說是神經網路的基礎,後續更為復雜的神經網路都離不開最簡單的感知機的模型,

談到機器學習,我們往往還會跟上一個詞語,叫做模式識別,但是真實環境中的模式識別往往會出現各種問題。比如:
圖像分割:真實場景中總是摻雜著其它物體。很難判斷哪些部分屬於同一個對象。對象的某些部分可以隱藏在其他對象的後面。
物體光照:像素的強度被光照強烈影響。
圖像變形:物體可以以各種非仿射方式變形。例如,手寫也可以有一個大的圓圈或只是一個尖頭。
情景支持:物體所屬類別通常由它們的使用方式來定義。例如,椅子是為了讓人們坐在上面而設計的,因此它們具有各種各樣的物理形狀。
卷積神經網路與普通神經網路的區別在於,卷積神經網路包含了一個由卷積層和子采樣層構成的特徵抽取器。在卷積神經網路的卷積層中,一個神經元只與部分鄰層神經元連接。在CNN的一個卷積層中,通常包含若干個特徵平面(featureMap),每個特徵平面由一些矩形排列的的神經元組成,同一特徵平面的神經元共享權值,這里共享的權值就是卷積核。卷積核一般以隨機小數矩陣的形式初始化,在網路的訓練過程中卷積核將學習得到合理的權值。共享權值(卷積核)帶來的直接好處是減少網路各層之間的連接,同時又降低了過擬合的風險。子采樣也叫做池化(pooling),通常有均值子采樣(mean pooling)和最大值子采樣(max pooling)兩種形式。子采樣可以看作一種特殊的卷積過程。卷積和子采樣大大簡化了模型復雜度,減少了模型的參數。
卷積神經網路由三部分構成。第一部分是輸入層。第二部分由n個卷積層和池化層的組合組成。第三部分由一個全連結的多層感知機分類器構成。
這里舉AlexNet為例:

·輸入:224×224大小的圖片,3通道
·第一層卷積:11×11大小的卷積核96個,每個GPU上48個。
·第一層max-pooling:2×2的核。
·第二層卷積:5×5卷積核256個,每個GPU上128個。
·第二層max-pooling:2×2的核。
·第三層卷積:與上一層是全連接,3*3的卷積核384個。分到兩個GPU上個192個。
·第四層卷積:3×3的卷積核384個,兩個GPU各192個。該層與上一層連接沒有經過pooling層。
·第五層卷積:3×3的卷積核256個,兩個GPU上個128個。
·第五層max-pooling:2×2的核。
·第一層全連接:4096維,將第五層max-pooling的輸出連接成為一個一維向量,作為該層的輸入。
·第二層全連接:4096維
·Softmax層:輸出為1000,輸出的每一維都是圖片屬於該類別的概率。

卷積神經網路在模式識別領域有著重要應用,當然這里只是對卷積神經網路做了最簡單的講解,卷積神經網路中仍然有很多知識,比如局部感受野,權值共享,多卷積核等內容,後續有機會再進行講解。

傳統的神經網路對於很多問題難以處理,比如你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNN之所以稱為循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNN能夠對任何長度的序列數據進行處理。
這是一個簡單的RNN的結構,可以看到隱藏層自己是可以跟自己進行連接的。

那麼RNN為什麼隱藏層能夠看到上一刻的隱藏層的輸出呢,其實我們把這個網路展開來開就很清晰了。

從上面的公式我們可以看出,循環層和全連接層的區別就是循環層多了一個權重矩陣 W。
如果反復把式2帶入到式1,我們將得到:

在講DBN之前,我們需要對DBN的基本組成單位有一定的了解,那就是RBM,受限玻爾茲曼機。
首先什麼是玻爾茲曼機?
[圖片上傳失敗...(image-d36b31-1519636788074)]
如圖所示為一個玻爾茲曼機,其藍色節點為隱層,白色節點為輸入層。
玻爾茲曼機和遞歸神經網路相比,區別體現在以下幾點:
1、遞歸神經網路本質是學習一個函數,因此有輸入和輸出層的概念,而玻爾茲曼機的用處在於學習一組數據的「內在表示」,因此其沒有輸出層的概念。
2、遞歸神經網路各節點鏈接為有向環,而玻爾茲曼機各節點連接成無向完全圖。

而受限玻爾茲曼機是什麼呢?
最簡單的來說就是加入了限制,這個限制就是將完全圖變成了二分圖。即由一個顯層和一個隱層構成,顯層與隱層的神經元之間為雙向全連接。

h表示隱藏層,v表示顯層
在RBM中,任意兩個相連的神經元之間有一個權值w表示其連接強度,每個神經元自身有一個偏置系數b(對顯層神經元)和c(對隱層神經元)來表示其自身權重。
具體的公式推導在這里就不展示了

DBN是一個概率生成模型,與傳統的判別模型的神經網路相對,生成模型是建立一個觀察數據和標簽之間的聯合分布,對P(Observation|Label)和 P(Label|Observation)都做了評估,而判別模型僅僅而已評估了後者,也就是P(Label|Observation)。
DBN由多個限制玻爾茲曼機(Restricted Boltzmann Machines)層組成,一個典型的神經網路類型如圖所示。這些網路被「限制」為一個可視層和一個隱層,層間存在連接,但層內的單元間不存在連接。隱層單元被訓練去捕捉在可視層表現出來的高階數據的相關性。

生成對抗網路其實在之前的帖子中做過講解,這里在說明一下。
生成對抗網路的目標在於生成,我們傳統的網路結構往往都是判別模型,即判斷一個樣本的真實性。而生成模型能夠根據所提供的樣本生成類似的新樣本,注意這些樣本是由計算機學習而來的。
GAN一般由兩個網路組成,生成模型網路,判別模型網路。
生成模型 G 捕捉樣本數據的分布,用服從某一分布(均勻分布,高斯分布等)的雜訊 z 生成一個類似真實訓練數據的樣本,追求效果是越像真實樣本越好;判別模型 D 是一個二分類器,估計一個樣本來自於訓練數據(而非生成數據)的概率,如果樣本來自於真實的訓練數據,D 輸出大概率,否則,D 輸出小概率。
舉個例子:生成網路 G 好比假幣製造團伙,專門製造假幣,判別網路 D 好比警察,專門檢測使用的貨幣是真幣還是假幣,G 的目標是想方設法生成和真幣一樣的貨幣,使得 D 判別不出來,D 的目標是想方設法檢測出來 G 生成的假幣。
傳統的判別網路:

生成對抗網路:

下面展示一個cDCGAN的例子(前面帖子中寫過的)
生成網路

判別網路

最終結果,使用MNIST作為初始樣本,通過學習後生成的數字,可以看到學習的效果還是不錯的。

本文非常簡單的介紹了四種神經網路的架構,CNN,RNN,DBN,GAN。當然也僅僅是簡單的介紹,並沒有深層次講解其內涵。這四種神經網路的架構十分常見,應用也十分廣泛。當然關於神經網路的知識,不可能幾篇帖子就講解完,這里知識講解一些基礎知識,幫助大家快速入(zhuang)門(bi)。後面的帖子將對深度自動編碼器,Hopfield 網路長短期記憶網路(LSTM)進行講解。

B. 如何用visio畫卷積神經網路圖。圖形類似下圖所示

大概試了一下用visio繪制這個圖,除了最左面的變形圖片外其餘基本可以實現(版那個圖可以考慮用權其它圖像處理軟體比如Photoshop生成後插入visio),visio中主要用到的圖形可以在更多形狀-常規-具有透視效果的塊中找到塊圖形,拖入繪圖區後拉動透視角度調節的小紅點進行調整直到合適為止,其餘的塊可以按住ctrl+滑鼠左鍵進行拉動復制,然後再進行大小、位置仔細調整就可以了,大致繪出圖形示例如下圖所示:

C. 卷積神經網路

1、二維互相關運算

二維互相關(cross-correlation)運算的輸入是一個二維輸入數組和一個二維核(kernel)數組,輸出也是一個二維數組,其中核數組通常稱為卷積核或過濾器(filter)。卷積核的尺寸通常小於輸入數組,卷積核在輸入數組上滑動,在每個位置上,卷積核與該位置處的輸入子數組按元素相乘並求和,得到輸出數組中相應位置的元素。圖1展示了一個互相關運算的例子,陰影部分分別是輸入的第一個計算區域、核數組以及對應的輸出。

2、二維卷積層

卷積層得名於卷積運算,但卷積層中用到的並非卷積運算而是互相關運算。我們將核數組上下翻轉、左右翻轉,再與輸入數組做互相關運算,這一過程就是卷積運算。由於卷積層的核數組是可學習的,所以使用互相關運算與使用卷積運算並無本質區別。

二維卷積層將輸入和卷積核做互相關運算,並加上一個標量偏置來得到輸出。卷積層的模型參數包括卷積核和標量偏置。

3、特徵圖與感受野

二維卷積層輸出的二維數組可以看作是輸入在空間維度(寬和高)上某一級的表徵,也叫特徵圖(feature map)。影響元素x的前向計算的所有可能輸入區域(可能大於輸入的實際尺寸)叫做x的感受野(receptive field)。

以圖1為例,輸入中陰影部分的四個元素是輸出中陰影部分元素的感受野。我們將圖中形狀為2×2的輸出記為Y,將Y與另一個形狀為2×2的核數組做互相關運算,輸出單個元素z。那麼,z在Y上的感受野包括Y的全部四個元素,在輸入上的感受野包括其中全部9個元素。可見,我們可以通過更深的卷積神經網路使特徵圖中單個元素的感受野變得更加廣闊,從而捕捉輸入上更大尺寸的特徵。

4、填充和步幅

我們介紹卷積層的兩個超參數,即填充和步幅,它們可以對給定形狀的輸入和卷積核改變輸出形狀。

4.1 填充(padding)

是指在輸入高和寬的兩側填充元素(通常是0元素),圖2里我們在原輸入高和寬的兩側分別添加了值為0的元素。

如果原輸入的高和寬是 和 ,卷積核的高和寬是 和 ,在高的兩側一共填充 行,在寬的兩側一共填充 列,則輸出形狀為:

                                                               )

我們在卷積神經網路中使用奇數高寬的核,比如3×3,5×5的卷積核,對於高度(或寬度)為大小為2k+1的核,令步幅為1,在高(或寬)兩側選擇大小為k的填充,便可保持輸入與輸出尺寸相同。

4.2 步幅(stride)

在互相關運算中,卷積核在輸入數組上滑動,每次滑動的行數與列數即是步幅(stride)。此前我們使用的步幅都是1,圖3展示了在高上步幅為3、在寬上步幅為2的二維互相關運算。

一般來說,當高上步幅為 ,寬上步幅為 時,輸出形狀為:

                                         

如果  ,那麼輸出形狀將簡化為:

                                                          

更進一步,如果輸入的高和寬能分別被高和寬上的步幅整除,那麼輸出形狀將是:(nh/sh)×(nw/sw)

                                                                              

當 時,我們稱填充為p;當 時,我們稱步幅為s。

5、多輸入通道和多輸出通道

之前的輸入和輸出都是二維數組,但真實數據的維度經常更高。例如,彩色圖像在高和寬2個維度外還有RGB(紅、綠、藍)3個顏色通道。假設彩色圖像的高和寬分別是h和w(像素),那麼它可以表示為一個3×h×w的多維數組,我們將大小為3的這一維稱為通道(channel)維。

5.1 多輸入通道

卷積層的輸入可以包含多個通道,圖4展示了一個含2個輸入通道的二維互相關計算的例子。

5.2 多輸出通道

卷積層的輸出也可以包含多個通道,設卷積核輸入通道數和輸出通道數分別為ci和co,高和寬分別為kh和kw。如果希望得到含多個通道的輸出,我們可以為每個輸出通道分別創建形狀為ci×kh×kw的核數組,將它們在輸出通道維上連結,卷積核的形狀即co×ci×kh×kw。

對於輸出通道的卷積核,我們提供這樣一種理解,一個ci×kh×kw的核數組可以提取某種局部特徵,但是輸入可能具有相當豐富的特徵,我們需要有多個這樣的ci×kh×kw的核數組,不同的核數組提取的是不同的特徵。

5.3 1x1卷積層

最後討論形狀為1×1的卷積核,我們通常稱這樣的卷積運算為1×1卷積,稱包含這種卷積核的卷積層為1×1卷積層。圖5展示了使用輸入通道數為3、輸出通道數為2的1×1卷積核的互相關計算。

1×1卷積核可在不改變高寬的情況下,調整通道數。1×1卷積核不識別高和寬維度上相鄰元素構成的模式,其主要計算發生在通道維上。假設我們將通道維當作特徵維,將高和寬維度上的元素當成數據樣本,那麼1×1卷積層的作用與全連接層等價。

6、卷積層與全連接層的對比

二維卷積層經常用於處理圖像,與此前的全連接層相比,它主要有兩個優勢:

一是全連接層把圖像展平成一個向量,在輸入圖像上相鄰的元素可能因為展平操作不再相鄰,網路難以捕捉局部信息。而卷積層的設計,天然地具有提取局部信息的能力。

二是卷積層的參數量更少。不考慮偏置的情況下,一個形狀為(ci,co,h,w)的卷積核的參數量是ci×co×h×w,與輸入圖像的寬高無關。假如一個卷積層的輸入和輸出形狀分別是(c1,h1,w1)和(c2,h2,w2),如果要用全連接層進行連接,參數數量就是c1×c2×h1×w1×h2×w2。使用卷積層可以以較少的參數數量來處理更大的圖像。

X=torch.rand(4,2,3,5)

print(X.shape)

conv2d=nn.Conv2d(in_channels=2,out_channels=3,kernel_size=(3,5),stride=1,padding=(1,2))

Y=conv2d(X)

print('Y.shape: ',Y.shape)

print('weight.shape: ',conv2d.weight.shape)

print('bias.shape: ',conv2d.bias.shape)

輸出:

torch.Size([4, 2, 3, 5])

Y.shape:  torch.Size([4, 3, 3, 5])

weight.shape:  torch.Size([3, 2, 3, 5])

bias.shape:  torch.Size([3])

7、池化

7.1 二維池化層

池化層主要用於緩解卷積層對位置的過度敏感性。同卷積層一樣,池化層每次對輸入數據的一個固定形狀窗口(又稱池化窗口)中的元素計算輸出,池化層直接計算池化窗口內元素的最大值或者平均值,該運算也分別叫做最大池化或平均池化。圖6展示了池化窗口形狀為2×2的最大池化。

二維平均池化的工作原理與二維最大池化類似,但將最大運算符替換成平均運算符。池化窗口形狀為p×q的池化層稱為p×q池化層,其中的池化運算叫作p×q池化。

池化層也可以在輸入的高和寬兩側填充並調整窗口的移動步幅來改變輸出形狀。池化層填充和步幅與卷積層填充和步幅的工作機制一樣。

在處理多通道輸入數據時,池化層對每個輸入通道分別池化,但不會像卷積層那樣將各通道的結果按通道相加。這意味著池化層的輸出通道數與輸入通道數相等。

CNN網路中另外一個不可導的環節就是Pooling池化操作,因為Pooling操作使得feature map的尺寸變化,假如做2×2的池化,假設那麼第l+1層的feature map有16個梯度,那麼第l層就會有64個梯度,這使得梯度無法對位的進行傳播下去。其實解決這個問題的思想也很簡單,就是把1個像素的梯度傳遞給4個像素,但是需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的。

7.2 mean pooling

mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變,還是比較理解的,圖示如下:

mean pooling比較容易讓人理解錯的地方就是會簡單的認為直接把梯度復制N遍之後直接反向傳播回去,但是這樣會造成loss之和變為原來的N倍,網路是會產生梯度爆炸的。

7.3 max pooling

max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id。

源碼中有一個max_idx_的變數,這個變數就是記錄最大值所在位置的,因為在反向傳播中要用到,那麼假設前向傳播和反向傳播的過程就如下圖所示。

7.4 Pytorch 實現池化層

我們使用Pytorch中的nn.MaxPool2d實現最大池化層,關注以下構造函數參數:

kernel_size – the size of the window to take a max over

stride – the stride of the window. Default value is kernel_size

padding – implicit zero padding to be added on both sides

forward函數的參數為一個四維張量,形狀為 ,返回值也是一個四維張量,形狀為 ,其中N是批量大小,C,H,W分別表示通道數、高度、寬度。

X=torch.arange(32,dtype=torch.float32).view(1,2,4,4)

pool2d=nn.MaxPool2d(kernel_size=3,padding=1,stride=(2,1))

Y=pool2d(X)

print(X)

print(Y)

練習

1、假如你用全連接層處理一張256 \times 256256×256的彩色(RGB)圖像,輸出包含1000個神經元,在使用偏置的情況下,參數數量是:

     答:圖像展平後長度為3×256×256,權重參數和偏置參數的數量是3× 256× 256 × 1000 + 1000 =196609000。

2、假如你用全連接層處理一張256×256的彩色(RGB)圖像,卷積核的高寬是3×3,輸出包含10個通道,在使用偏置的情況下,這個卷積層共有多少個參數:

    答:輸入通道數是3,輸出通道數是10,所以參數數量是10×3×3×3+10=280。

3、conv2d = nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, padding=2),輸入一張形狀為3×100×100的圖像,輸出的形狀為:

    答:輸出通道數是4,上下兩側總共填充4行,卷積核高度是3,所以輸出的高度是104 - 3 + 1=102104−3+1=102,寬度同理可得。

4、關於卷積層,以下哪種說法是錯誤的:

A.1×1卷積可以看作是通道維上的全連接

B.某個二維卷積層用於處理形狀為3×100×100的輸入,則該卷積層無法處理形狀為3×256×256的輸入

C.卷積層通過填充、步幅、輸入通道數、輸出通道數等調節輸出的形狀

D .兩個連續的3×3卷積核的感受野與一個5×5卷積核的感受野相同

答:選B,對於高寬維度,只要輸入的高寬(填充後的)大於或等於卷積核的高寬即可進行計算。

the first layer is a 3 × 3 convolution, the second is a fully connected layer on top of the 3 × 3 output grid of the first layer (see Figure 1). Sliding this small network over the input activation grid boils down to replacing the 5 × 5 convolution with two layers of 3 × 3 convolution.

我們假設圖片是5*5的

我們使用5*5的卷積核對其卷積,步長為1,得到的結果是:(5-5)/1+1=1

然後我們使用2個卷積核為3*3的,這里的兩個是指2層:

第一層3*3:

得到的結果是(5-3)/1+1=3

第二層3*3:

得到的結果是(3-3)/1+1=1

所以我們的最終得到結果感受野大小和用5*5的卷積核得到的結果大小是一樣的!!!

5、關於池化層,以下哪種說法是錯誤的:

A.池化層不參與反向傳播

B.池化層沒有模型參數

C.池化層通常會減小特徵圖的高和寬

D.池化層的輸入和輸出具有相同的通道數

答:A

選項1:錯誤,池化層有參與模型的正向計算,同樣也會參與反向傳播

選項2:正確,池化層直接對窗口內的元素求最大值或平均值,並沒有模型參數參與計算

選項3:正確

選項4:正確

參考文獻:

https://www.boyuai.com/

https://blog.csdn.net/qq_21578849/article/details/94667699

https://www.hu.com/question/265791259/answer/298610437

https://blog.csdn.net/zouxiaolv/article/details/97366681

D. 一文看懂卷積神經網路-CNN(基本原理+獨特價值+實際應用)

在 CNN 出現之前,圖像對於人工智慧來說是一個難題,有2個原因:

圖像需要處理的數據量太大,導致成本很高,效率很低

圖像在數字化的過程中很難保留原有的特徵,導致圖像處理的准確率不高

下面就詳細說明一下這2個問題:

圖像是由像素構成的,每個像素又是由顏色構成的。

現在隨隨便便一張圖片都是 1000×1000 像素以上的, 每個像素都有RGB 3個參數來表示顏色信息。

假如我們處理一張 1000×1000 像素的圖片,我們就需要處理3百萬個參數!

1000×1000×3=3,000,000

這么大量的數據處理起來是非常消耗資源的,而且這只是一張不算太大的圖片!

卷積神經網路 – CNN 解決的第一個問題就是「將復雜問題簡化」,把大量參數降維成少量參數,再做處理。

更重要的是:我們在大部分場景下,降維並不會影響結果。比如1000像素的圖片縮小成200像素,並不影響肉眼認出來圖片中是一隻貓還是一隻狗,機器也是如此。

圖片數字化的傳統方式我們簡化一下,就類似下圖的過程:

假如有圓形是1,沒有圓形是0,那麼圓形的位置不同就會產生完全不同的數據表達。但是從視覺的角度來看, 圖像的內容(本質)並沒有發生變化,只是位置發生了變化 。

所以當我們移動圖像中的物體,用傳統的方式的得出來的參數會差異很大!這是不符合圖像處理的要求的。

而 CNN 解決了這個問題,他用類似視覺的方式保留了圖像的特徵,當圖像做翻轉,旋轉或者變換位置時,它也能有效的識別出來是類似的圖像。

那麼卷積神經網路是如何實現的呢?在我們了解 CNN 原理之前,先來看看人類的視覺原理是什麼?

深度學習的許多研究成果,離不開對大腦認知原理的研究,尤其是視覺原理的研究。

1981 年的諾貝爾醫學獎,頒發給了 David Hubel(出生於加拿大的美國神經生物學家) 和TorstenWiesel,以及 Roger Sperry。前兩位的主要貢獻,是「 發現了視覺系統的信息處理 」,可視皮層是分級的。

人類的視覺原理如下:從原始信號攝入開始(瞳孔攝入像素 Pixels),接著做初步處理(大腦皮層某些細胞發現邊緣和方向),然後抽象(大腦判定,眼前的物體的形狀,是圓形的),然後進一步抽象(大腦進一步判定該物體是只氣球)。下面是人腦進行人臉識別的一個示例:

對於不同的物體,人類視覺也是通過這樣逐層分級,來進行認知的:

我們可以看到,在最底層特徵基本上是類似的,就是各種邊緣,越往上,越能提取出此類物體的一些特徵(輪子、眼睛、軀乾等),到最上層,不同的高級特徵最終組合成相應的圖像,從而能夠讓人類准確的區分不同的物體。

那麼我們可以很自然的想到:可以不可以模仿人類大腦的這個特點,構造多層的神經網路,較低層的識別初級的圖像特徵,若干底層特徵組成更上一層特徵,最終通過多個層級的組合,最終在頂層做出分類呢?

答案是肯定的,這也是許多深度學習演算法(包括CNN)的靈感來源。

典型的 CNN 由3個部分構成:

卷積層

池化層

全連接層

如果簡單來描述的話:

卷積層負責提取圖像中的局部特徵;池化層用來大幅降低參數量級(降維);全連接層類似傳統神經網路的部分,用來輸出想要的結果。

下面的原理解釋為了通俗易懂,忽略了很多技術細節,如果大家對詳細的原理感興趣,可以看這個視頻《 卷積神經網路基礎 》。

卷積層的運算過程如下圖,用一個卷積核掃完整張圖片:

這個過程我們可以理解為我們使用一個過濾器(卷積核)來過濾圖像的各個小區域,從而得到這些小區域的特徵值。

在具體應用中,往往有多個卷積核,可以認為,每個卷積核代表了一種圖像模式,如果某個圖像塊與此卷積核卷積出的值大,則認為此圖像塊十分接近於此卷積核。如果我們設計了6個卷積核,可以理解:我們認為這個圖像上有6種底層紋理模式,也就是我們用6中基礎模式就能描繪出一副圖像。以下就是25種不同的卷積核的示例:

總結:卷積層的通過卷積核的過濾提取出圖片中局部的特徵,跟上面提到的人類視覺的特徵提取類似。

池化層簡單說就是下采樣,他可以大大降低數據的維度。其過程如下:

上圖中,我們可以看到,原始圖片是20×20的,我們對其進行下采樣,采樣窗口為10×10,最終將其下采樣成為一個2×2大小的特徵圖。

之所以這么做的原因,是因為即使做完了卷積,圖像仍然很大(因為卷積核比較小),所以為了降低數據維度,就進行下采樣。

總結:池化層相比卷積層可以更有效的降低數據維度,這么做不但可以大大減少運算量,還可以有效的避免過擬合。

這個部分就是最後一步了,經過卷積層和池化層處理過的數據輸入到全連接層,得到最終想要的結果。

經過卷積層和池化層降維過的數據,全連接層才能」跑得動」,不然數據量太大,計算成本高,效率低下。

典型的 CNN 並非只是上面提到的3層結構,而是多層結構,例如 LeNet-5 的結構就如下圖所示:

卷積層 – 池化層- 卷積層 – 池化層 – 卷積層 – 全連接層

在了解了 CNN 的基本原理後,我們重點說一下 CNN 的實際應用有哪些。

卷積神經網路 – CNN 很擅長處理圖像。而視頻是圖像的疊加,所以同樣擅長處理視頻內容。下面給大家列一些比較成熟的應用�:

圖像分類、檢索

圖像分類是比較基礎的應用,他可以節省大量的人工成本,將圖像進行有效的分類。對於一些特定領域的圖片,分類的准確率可以達到 95%+,已經算是一個可用性很高的應用了。

典型場景:圖像搜索…

目標定位檢測

可以在圖像中定位目標,並確定目標的位置及大小。

典型場景:自動駕駛、安防、醫療…

目標分割

簡單理解就是一個像素級的分類。

他可以對前景和背景進行像素級的區分、再高級一點還可以識別出目標並且對目標進行分類。

典型場景:美圖秀秀、視頻後期加工、圖像生成…

人臉識別

人臉識別已經是一個非常普及的應用了,在很多領域都有廣泛的應用。

典型場景:安防、金融、生活…

骨骼識別

骨骼識別是可以識別身體的關鍵骨骼,以及追蹤骨骼的動作。

典型場景:安防、電影、圖像視頻生成、游戲…

今天我們介紹了 CNN 的價值、基本原理和應用場景,簡單總結如下:

CNN 的價值:

能夠將大數據量的圖片有效的降維成小數據量(並不影響結果)

能夠保留圖片的特徵,類似人類的視覺原理

CNN 的基本原理:

卷積層 – 主要作用是保留圖片的特徵

池化層 – 主要作用是把數據降維,可以有效的避免過擬合

全連接層 – 根據不同任務輸出我們想要的結果

CNN 的實際應用:

圖片分類、檢索

目標定位檢測

目標分割

人臉識別

骨骼識別

本文首發在 easyAI - 人工智慧知識庫

《 一文看懂卷積神經網路-CNN(基本原理+獨特價值+實際應用) 》

E. 卷積神經網路

卷積神經網路 (Convolutional Neural Networks,CNN)是一種前饋神經網路。卷積神經網路是受生物學上感受野(Receptive Field)的機制而提出的。感受野主要是指聽覺系統、本體感覺系統和視覺系統中神經元的一些性質。比如在視覺神經系統中,一個神經元的感受野是指視網膜上的特定區域,只有這個區域內的刺激才能夠激活該神經元。

卷積神經網路又是怎樣解決這個問題的呢?主要有三個思路:

在使用CNN提取特徵時,到底使用哪一層的輸出作為最後的特徵呢?

答:倒數第二個全連接層的輸出才是最後我們要提取的特徵,也就是最後一個全連接層的輸入才是我們需要的特徵。

全連接層會忽視形狀。卷積層可以保持形狀不變。當輸入數據是圖像時,卷積層會以3維數據的形式接收輸入數據,並同樣以3維數據的形式輸出至下一層。因此,在CNN中,可以(有可能)正確理解圖像等具有形狀的數據。

CNN中,有時將 卷積層的輸入輸出數據稱為特徵圖(feature map) 。其中, 卷積層的輸入數據稱為輸入特徵圖(input feature map) 輸出數據稱為輸出特徵圖(output feature map)。

卷積層進行的處理就是 卷積運算 。卷積運算相當於圖像處理中的「濾波器運算」。

濾波器相當於權重或者參數,濾波器數值都是學習出來的。 卷積層實現的是垂直邊緣檢測

邊緣檢測實際就是將圖像由亮到暗進行區分,即邊緣的過渡(edge transitions)。

卷積層對應到全連接層,左上角經過濾波器,得到的3,相當於一個神經元輸出為3.然後相當於,我們把輸入矩陣拉直為36個數據,但是我們只對其中的9個數據賦予了權重。

步幅為1 ,移動一個,得到一個1,相當於另一個神經單元的輸出是1.

並且使用的是同一個濾波器,對應到全連接層,就是權值共享。

在這個例子中,輸入數據是有高長方向的形狀的數據,濾波器也一樣,有高長方向上的維度。假設用(height, width)表示數據和濾波器的形狀,則在本例中,輸入大小是(4, 4),濾波器大小是(3, 3),輸出大小是(2, 2)。另外,有的文獻中也會用「核」這個詞來表示這里所說的「濾波器」。

對於輸入數據,卷積運算以一定間隔滑動濾波器的窗口並應用。這里所說的窗口是指圖7-4中灰色的3 × 3的部分。如圖7-4所示,將各個位置上濾
波器的元素和輸入的對應元素相乘,然後再求和(有時將這個計算稱為乘積累加運算)。然後,將這個結果保存到輸出的對應位置。將這個過程在所有位置都進行一遍,就可以得到卷積運算的輸出。

CNN中,濾波器的參數就對應之前的權重。並且,CNN中也存在偏置。

在進行卷積層的處理之前,有時要向輸入數據的周圍填入固定的數據(比如0等),這稱為填充(padding),是卷積運算中經常會用到的處理。比如,在圖7-6的例子中,對大小為(4, 4)的輸入數據應用了幅度為1的填充。「幅度為1的填充」是指用幅度為1像素的0填充周圍。

應用濾波器的位置間隔稱為 步幅(stride)

假設輸入大小為(H, W),濾波器大小為(FH, FW),輸出大小為(OH, OW),填充為P,步幅為S。

但是所設定的值必須使式(7.1)中的 和 分別可以除盡。當輸出大小無法除盡時(結果是小數時),需要採取報錯等對策。順便說一下,根據深度學習的框架的不同,當值無法除盡時,有時會向最接近的整數四捨五入,不進行報錯而繼續運行。

之前的卷積運算的例子都是以有高、長方向的2維形狀為對象的。但是,圖像是3維數據,除了高、長方向之外,還需要處理通道方向。

在3維數據的卷積運算中,輸入數據和濾波器的通道數要設為相同的值。

因此,作為4維數據,濾波器的權重數據要按(output_channel, input_channel, height, width)的順序書寫。比如,通道數為3、大小為5 × 5的濾
波器有20個時,可以寫成(20, 3, 5, 5)。

對於每個通道,均使用自己的權值矩陣進行處理,輸出時將多個通道所輸出的值進行加和即可。

卷積運算的批處理,需要將在各層間傳遞的數據保存為4維數據。具體地講,就是按(batch_num, channel, height, width)的順序保存數據。

這里需要注意的是,網路間傳遞的是4維數據,對這N個數據進行了卷積運算。也就是說,批處理將N次的處理匯總成了1次進行。

池化是縮小高、長方向上的空間的運算。比如,如圖7-14所示,進行將2 × 2的區域集約成1個元素的處理,縮小空間大小。

圖7-14的例子是按步幅2進行2 × 2的Max池化時的處理順序。「Max池化」是獲取最大值的運算,「2 × 2」表示目標區域的大小。如圖所示,從
2 × 2的區域中取出最大的元素。此外,這個例子中將步幅設為了2,所以2 × 2的窗口的移動間隔為2個元素。另外,一般來說,池化的窗口大小會和步幅設定成相同的值。比如,3 × 3的窗口的步幅會設為3,4 × 4的窗口的步幅會設為4等。

除了Max池化之外,還有Average池化等。相對於Max池化是從目標區域中取出最大值,Average池化則是計算目標區域的平均值。 在圖像識別領域,主要使用Max池化。 因此,本書中說到「池化層」時,指的是Max池化。

池化層的特徵
池化層有以下特徵。
沒有要學習的參數
池化層和卷積層不同,沒有要學習的參數。池化只是從目標區域中取最大值(或者平均值),所以不存在要學習的參數。
通道數不發生變化
經過池化運算,輸入數據和輸出數據的通道數不會發生變化。如圖7-15所示,計算是按通道獨立進行的。

對微小的位置變化具有魯棒性(健壯)
​ 輸入數據發生微小偏差時,池化仍會返回相同的結果。因此,池化對輸入數據的微小偏差具有魯棒性。比如,3 × 3的池化的情況下,如圖
​ 7-16所示,池化會吸收輸入數據的偏差(根據數據的不同,結果有可能不一致)。

經過卷積層和池化層之後,進行Flatten,然後丟到全連接前向傳播神經網路。

(找到一張圖片使得某個filter響應最大。相當於filter固定,未知的是輸入的圖片。)未知的是輸入的圖片???

k是第k個filter,x是我們要找的參數。?這里我不是很明白。我得理解應該是去尋找最具有代表性的特徵。

使用im2col來實現卷積層

卷積層的參數是需要學習的,但是池化層沒有參數需要學習。全連接層的參數需要訓練得到。

池化層不需要訓練參數。全連接層的參數最多。卷積核的個數逐漸增多。激活層的size,逐漸減少。

最大池化只是計算神經網路某一層的靜態屬性,沒有什麼需要學習的,它只是一個靜態屬性

像這樣展開之後,只需對展開的矩陣求各行的最大值,並轉換為合適的形狀即可(圖7-22)。

參數
• input_dim ― 輸入數據的維度:( 通道,高,長 )
• conv_param ― 卷積層的超參數(字典)。字典的關鍵字如下:
filter_num ― 濾波器的數量
filter_size ― 濾波器的大小
stride ― 步幅
pad ― 填充
• hidden_size ― 隱藏層(全連接)的神經元數量
• output_size ― 輸出層(全連接)的神經元數量
• weitght_int_std ― 初始化時權重的標准差

LeNet

LeNet在1998年被提出,是進行手寫數字識別的網路。如圖7-27所示,它有連續的卷積層和池化層(正確地講,是只「抽選元素」的子采樣層),最後經全連接層輸出結果。

和「現在的CNN」相比,LeNet有幾個不同點。第一個不同點在於激活函數。LeNet中使用sigmoid函數,而現在的CNN中主要使用ReLU函數。
此外,原始的LeNet中使用子采樣(subsampling)縮小中間數據的大小,而現在的CNN中Max池化是主流。

AlexNet

在LeNet問世20多年後,AlexNet被發布出來。AlexNet是引發深度學習熱潮的導火線,不過它的網路結構和LeNet基本上沒有什麼不同,如圖7-28所示。

AlexNet疊有多個卷積層和池化層,最後經由全連接層輸出結果。雖然結構上AlexNet和LeNet沒有大的不同,但有以下幾點差異。
• 激活函數使用ReLU。
• 使用進行局部正規化的LRN(Local Response Normalization)層。
• 使用Dropout

TF2.0實現卷積神經網路

valid意味著不填充,same是填充
or the SAME padding, the output height and width are computed as:

out_height = ceil(float(in_height) / float(strides[1]))

out_width = ceil(float(in_width) / float(strides[2]))

And

For the VALID padding, the output height and width are computed as:

out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))

out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
因此,我們可以設定 padding 策略。在 tf.keras.layers.Conv2D 中,當我們將 padding 參數設為 same 時,會將周圍缺少的部分使用 0 補齊,使得輸出的矩陣大小和輸入一致。

F. [圖像演算法]-理解卷積神經網路CNN中的特徵圖(feature map)

  在每個卷積層,數據都是以三維形式存在的。你可以把它看成許多個二維圖片疊在一起,其中每一個稱為一個feature map。在輸入層,如果是灰度圖片,那就只有一個feature map;如果是彩色圖片,一般就是3個feature map(紅綠藍)。層與層之間會有若干個卷積核(kernel),上一層和每個feature map跟每個卷積核做卷積,都會產生下一層的一個feature map。
  feature map(下圖紅線標出) 即:該層卷積核的個數,有多少個卷積核,經過卷積就會產生多少個feature map,也就是下圖中 豆腐皮兒 的層數、同時也是下圖 豆腐塊 的深度(寬度)!!這個寬度可以手動指定,一般網路越深的地方這個值越大,因為隨著網路的加深,feature map的長寬尺寸縮小,本卷積層的每個map提取的特徵越具有代表性(精華部分),所以後一層卷積層需要增加feature map的數量,才能更充分的提取出前一層的特徵,一般是成倍增加(不過具體論文會根據實驗情況具體設置)!

feature map計算方法

G. 卷積神經網路通俗理解

卷積神經網路通俗理解如下:

卷積神經網路(CNN)-結構

① CNN結構一般包含這幾個層:

H. 卷積神經網路(Convolutional Neural Networks, CNN)——更有效率地提取特徵

卷積神經網路(Convolutional Neural Networks, CNN)——更有效率地提取特徵

圖像識別問題本質上就是分類問題,比如我們要區分貓和狗,那麼我們就需要構建一個模型,將照片丟進去後,模型能輸出貓或者狗的概率有多大。在做圖像識別時首要的就是要提取圖片的特徵,那麼如何提取圖片的特徵呢?前面講到了前向全連接網路,我們可以嘗試用前向全連接網路提取。假設圖片的像素是100*100,如果如片是彩色的,每個像素都有RGB三種顏色的數值。因此,一張圖片是有一個三維向量構成的,一維是長100,一維是寬100,還有一維是R、G、B 3個通道(channels)。把這個三維向量拉直作為一個一維向量,長度就是100*100*3。

我們在區分一張圖片時,我們觀察的往往是圖片的局部的、最重要的特徵。 比如圖片上是一隻鳥,我們可能通過嘴巴、眼睛、爪子等就可以判斷出是一隻鳥了。因此,輸入層的每一個神經元沒有必要看圖片的全局,只需要看一個局部就行了。

在兩張不同的圖片上,同一個特徵區域可能處於不同位置。 比如鳥嘴的局部特徵區域在下面這兩張圖上就處在不同的位置上。那麼如何才能讓兩個不同的神經元在看到這兩個不同的感受野時,能產生一致的特徵值呢?

對上面的內容進行一個總結:
(1)我們設置一個局部感受野,假設感受野的大小為W*H*C,其中W表示感受野的寬度,H表示感受野的高度,C表示感受野的通道數。那麼對應的神經元的參數的個數就為:W*H*C個權值加1個偏置。在卷積神經網路中,我們稱這樣一個神經元為一個 濾波器(filter)
(3)我們通過滑動的方式讓感受野鋪滿整個圖片,假設圖片的尺寸是W1*H1*C,滑動步長為S,零填充的數量為P。假設感受野的個數是W2*H2,其中,
(4)我們讓所有感受野的觀測濾波器參數進行共享,即相當於一個濾波器通過滑動掃描的方式掃描了所有感受野。
(5)我們設置多個濾波器,假設濾波器的個數為K,這K個濾波器都通過滑動掃描的方式掃過整個圖片。此時參數的個數為:(W*H*C+1)*K。
(6)由於每個濾波器每經過一個感受野都會進行一次計算輸出一個值,所以輸出的維度為:W2*H2*K。我們將這個輸出稱為特徵圖,所以特徵圖寬度為W2,高度為H2,通道數C2=K。
舉個例子: 假設某個圖片的大小是100*100*3,設置濾波器的大小為3*3*3,濾波器的個數為64,設置步長S=1,設置零填充的數量為P=0。那麼卷積神經網路的參數為, 相比前向全連接 個參數,參數的個數縮小了幾個數量級。
輸出特徵圖的寬度和高度均為, 輸出特徵圖的通道數為, 所以輸出特徵圖的維度為98*98*64。
如果在上面輸出的基礎上再疊加一層卷積神經網路,濾波器的設置寬和高可以不變,但是通道數不再是3了,而是變成64了,因為輸入特徵圖的通道數已經變64了。假設濾波器的大小為3*3*64,濾波器的個數為32,設置步長S=1,設置零填充的數量為P=0。可以計算出來,新的輸出特徵圖的維度是96*96*32。

以上就是卷積神經網路(CNN)的解析。但是CNN一般不是單獨用的,因為一般提取圖片的特徵是為了分類,還需要進一步處理,常見的形式如下圖所示。

I. 圖卷積神經網路的數學原理詳解——筆記(更新中)

Image是Graph在歐式空間中的一種特例。Graph是相較於Image來說更加廣義的一種拓撲結構。Graph由點和邊組成它可以表示任意的事物與事物之間的關系。而Image是表示在歐式空間中的事物與事物之間的關系。我們可以根據Image來構建對應的Graph,將每一個像素作為節點,像素之間的關系作為邊。

現實生活中能夠建圖的場景非常之多,社交關系,詞彙搜索等等。

圖神經網路就是專門用來處理圖數據的神經網路架構。具體來說,會給定圖的每個鄰接矩陣和節點特徵,通過將這兩個輸入進行某種圖上的映射。從而得到每個節點下一層的特徵。

圖神經網路的聚合模式:

合理性:比如社交網路中我們想要獲得某一個用戶的特徵,可以搜集與他相近的人的特徵,他們會具有一定的相關性。(近朱者赤,近墨者黑)

許多GNN相關的模型其實都是在設計函數「 f 」

這里我們只討論簡單無向圖(圖無自環、無重邊,邊無方向)

公式中的 是鄰接矩陣+單位矩陣,相當於給每一個節點添加一個自環。 是對角陣+單位陣。表示添加自環後每一個節點的度值。 代表了每一個節點的度的值。對於對角陣求冪,只要對對角線上的每一個元素求冪即可。

是可訓練的參數,是對輸入的feature進行線性變換。 是非線性的激活函數。

簡單理解GCN在做什麼:對圖的鄰接矩陣加了一個自環,做了對稱歸一化。然後用得到的結果對輸入的特徵進行聚合。每個節點都聚合到了自己和周邊節點加權求和的feature信息。

研究與圖的鄰接矩陣相關的一些性質的領域。將線性代數研究矩陣性質限定在了研究圖的鄰接矩陣的范圍內。譜圖理論是線性代數的子領域。

對於一個矩陣 ,如果有 其中 為標量、 。就稱 是 的特徵向量, 是A的特徵值。

如果一個矩陣是一個實對稱陣,那麼它一定有N個特徵值,對應著N個互相正交的特徵向量。

,其中 , 除了對角線上以外其他元素都是0。對角線上的元素都是一個特徵值。

半正定矩陣就是所有的特徵值都大於等於0。

給定一個矩陣A,左乘x轉置,右乘x。 就稱為向量x對矩陣A的二次型。

瑞利熵就是一個向量關於矩陣A的二次型與這個向量關於單位矩陣的二次型的比值 。

為什麼需要研究瑞利熵:因為其與矩陣的特徵值有著密切的聯系。如我們假定 是矩陣A的一個特徵向量,那麼瑞利熵就是矩陣對應的特徵值。

因此瑞利熵是我們研究特徵值的重要手段。

是圖的拉普拉斯矩陣, 。

是拉普拉斯矩陣的對稱規范化, 。

與 都是實對稱陣。因此他們都有N個特徵值和N個互相正交的特徵向量。可以分解為上述的 的形式。且這兩個矩陣都是半正定的,其特徵值都是大於等於0的。

一個更加強的性質: 不僅 而且 。

由上述證明我們得出 的瑞利熵是 的。因此 的特徵值也是恆 的。

傅里葉變換其實就是「去研究同一個事物在不同的域之間不同的視角」是怎樣的,以及在不同的域之間進行變換。

閱讀全文

與卷積神經網路圖示相關的資料

熱點內容
linux開機啟動 瀏覽:637
哪個app有拼音樂 瀏覽:226
qq音樂微信朋友圈 瀏覽:542
手機文件里的word文檔 瀏覽:348
手機微博舊版本 瀏覽:964
ps安裝文件夾刪除需要許可權 瀏覽:289
怎麼搜索手機中視頻文件 瀏覽:232
java判斷是偶數 瀏覽:860
java降序排序 瀏覽:739
ie9xp版本 瀏覽:718
哪些是通過計算機網路組網 瀏覽:265
iphone鎖屏密碼取消 瀏覽:41
win10怎麼添加電腦賬戶 瀏覽:388
視頻會議系統招標文件 瀏覽:588
iphone5s來電接聽 瀏覽:549
微信升級版本後無法播放騰訊視頻 瀏覽:482
賣場廣告的app哪裡下載 瀏覽:377
靈狐網路視頻下載 瀏覽:7
javaapr 瀏覽:561
蘋果se天線在哪 瀏覽:359

友情鏈接