Ⅰ Keras快速構建神經網路模型
用Keras搭建神經網路的步驟:
深度學習框架Keras——像搭積木般構建神經網路,主要分為7個部分,每個部分只需要幾個keras API函數就能實現,用戶即可像搭積木般一層層構建神經網路模型。
1. 創建模型 Create model
2. 添加層級 Add Layer
3. 模型編譯 Compile
4. 數據填充 Fit
5. 模型評估 Evaluate
6. 模型預測 Predict
7. 模型保存 Save model
下面章節會對每一部分具體來介紹。。。
Keras 中主要有三類模型:Sequential model, Functional model, Subclass model
在開始創建模型之前,首先需要引入tensorflow和keras模塊,然後再創建一個Sequential model
Sequential API定義如下:
layers參數可以為空, 然後通過add method向模型中添加layer,相對應的通過pop method移除模型中layer。
創建Function API模型,可以調用Keras.Model來指定多輸入多數出。
Keras.Model定義:
Layers是神經網路基本構建塊。一個Layer包含了tensor-in/tensor-out的計算方法和一些狀態,並保存在TensorFlow變數中(即layers的權重weights)。
Layers主要分為6個類別,基礎層,核心層,卷基層,池化層,循環層,融合層。
對派生類的實現可以用以下方法:
** init (): 定義layer的屬性,創建layer的靜態變數。
** build(self, input_shape): 創建依賴於輸入的變數,可以調用add_weight()。
** call(self, *args, **kwargs): 在確保已調用build()之後,在 call 中調用。
** get_config(self): 返回包含用於初始化此層的配置的字典類型。
創建SimpleDense派生類,在build()函數里添加trainable weights。實現y=input*w +b
結果輸出:
創建ComputeSum派生類,在 init 函數里添加 non-trainable weights。實現輸入矩陣沿軸0元素相加後,x=x+self.total
結果輸出:
核心層是最常用的層,涉及到數據的轉換和處理的時候都會用到這些層。
Dense層就是所謂的全連接神經網路層,簡稱全連接層。全連接層中的每個神經元與其前一層的所有神經元進行全連接。
Dense 實現以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐個元素計算的激活函數,kernel 是由網路層創建的權值矩陣,以及 bias 是其創建的偏置向量 (只在 use_bias 為 True 時才有用)。
將激活函數應用於輸出。輸入信號進入神經元後進行的運算處理。
sigmoid、tanh、ReLU、softplus的對比曲線如下圖所示:
激活函數可以通過設置單獨的激活層Activation實現,也可以在構造層對象時通過傳遞 activation 參數實現:
Dropout在訓練中每次更新時,將輸入單元的按比率隨機設置為0,這有助於防止過擬合。未設置為0的輸入將按1 /(1-rate)放大,以使所有輸入的總和不變。
請注意,僅當訓練設置為True時才應用Dropout層,以便在推理過程中不會丟棄任何值。 使用model.fit時,訓練將自動適當地設置為True。
將輸入展平。不影響批量大小。注意:如果輸入的形狀是(batch,)沒有特徵軸,則展平會增加通道尺寸,而輸出的形狀是(batch, 1)。
將輸入重新調整為特定的尺寸
將任意表達式封裝為Layer對象。在Lambda層,以便在構造模型時可以使用任意TensorFlow函數。 Lambda層最適合簡單操作或快速實驗。 Lambda層是通過序列化Python位元組碼來保存的。
使用覆蓋值覆蓋序列,以跳過時間步。
對於輸入張量的每一個時間步(張量的第一個維度),如果所有時間步中輸入張量的值與mask_value相等,則將在所有下游層中屏蔽(跳過)該時間步。如果任何下游層不支持覆蓋但仍然收到此類輸入覆蓋信息,會引發異常。
舉例說明:
Embedding 是一個將離散變數轉為連續向量表示的一個方式。該層只能用作模型中的第一層。
Embedding 有以下3個主要目的: 在 embedding 空間中查找最近鄰,這可以很好的用於根據用戶的興趣來進行推薦。 作為監督性學習任務的輸入。 用於可視化不同離散變數之間的關系.
舉例說明:
輸出結果:
由維基網路的介紹我們可以得知,卷積是一種定義在兩個函數(𝑓跟𝑔)上的數學操作,旨在產生一個新的函數。那麼𝑓和𝑔的卷積就可以寫成𝑓∗𝑔,數學定義如下:
對應到不同方面,卷積可以有不同的解釋:𝑔 既可以看作我們在深度學習里常說的核(Kernel),也可以對應到信號處理中的濾波器(Filter)。而 𝑓 可以是我們所說的機器學習中的特徵(Feature),也可以是信號處理中的信號(Signal)。f和g的卷積 (𝑓∗𝑔)就可以看作是對𝑓的加權求和。
一維時域卷積操作:
二維圖像卷積操作:
卷積運算的目的是提取輸入的不同特徵,第一層卷積層可能只能提取一些低級的特徵如邊緣、線條和角等層級,更多層的網路能從低級特徵中迭代提取更復雜的特徵。
一維卷積層(即時域卷積),用以在一維輸入信號上進行鄰域濾波。
舉例說明:
結果輸出:
2D 卷積層 (例如對圖像的空間卷積)。
舉例說明:
結果輸出:
3D卷積層(例如體積上的空間卷積)
舉例說明:
結果輸出:
深度可分離1D卷積。該層執行分別作用在通道上的深度卷積,然後是混合通道的逐點卷積。 如果use_bias為True並提供了一個偏差初始值設定項,則它將偏差向量添加到輸出中。 然後,它可選地應用激活函數以產生最終輸出。
深度可分離的2D卷積。可分離的卷積包括首先執行深度空間卷積(它分別作用於每個輸入通道),然後是點向卷積,它將混合所得的輸出通道。 depth_multiplier參數控制在深度步驟中每個輸入通道生成多少個輸出通道。
直觀上,可分離的卷積可以理解為將卷積內核分解為兩個較小內核的一種方式,或者是Inception塊的一種極端版本。
轉置卷積層 (有時被成為反卷積)。對轉置卷積的需求一般來自希望使用 與正常卷積相反方向的變換,將具有卷積輸出尺寸的東西 轉換為具有卷積輸入尺寸的東西, 同時保持與所述卷積相容的連通性模式。
池化層是模仿人的視覺系統對數據進行降維,用更高層次的特徵表示圖像。實施池化的目的:降低信息冗餘;提升模型的尺度不變性、旋轉不變性。 防止過擬合。
通常有最大池化層,平均池化層。
池化層有三種形態:1D 用於一維數據,2D 一般用於二維圖像數據,3D 帶時間序列數據的圖像數據
循環神經網路(Recurrent Neural Network, 簡稱 RNN),循環神經網路的提出便是基於記憶模型的想法,期望網路能夠記住前面出現的特徵,並依據特徵推斷後面的結果,而且整體的網路結構不斷循環,因此得名為循環神經網路。
長短期記憶網路(Long-Short Term Memory, LSTM )論文首次發表於1997年。由於獨特的設計結構,LSTM適合於處理和預測時間序列中間隔和延遲非常長的重要事件。
舉例說明:
結果輸出:
GRU 門控循環單元- Cho et al. 2014.
在LSTM中引入了三個門函數:輸入門、遺忘門和輸出門來控制輸入值、記憶值和輸出值。而在GRU模型中只有兩個門:分別是更新門和重置門。與LSTM相比,GRU內部少了一個」門控「,參數比LSTM少,但是卻也能夠達到與LSTM相當的功能。考慮到硬體的計算能力和時間成本,因而很多時候我們也就會選擇更加」實用「的GRU。
舉例說明:
結果輸出:
循環神經網路層基類。
關於指定 RNN 初始狀態的說明
您可以通過使用關鍵字參數 initial_state 調用它們來符號化地指定 RNN 層的初始狀態。 initial_state 的值應該是表示 RNN 層初始狀態的張量或張量列表。
可以通過調用帶有關鍵字參數 states 的 reset_states 方法來數字化地指定 RNN 層的初始狀態。 states 的值應該是一個代表 RNN 層初始狀態的 Numpy 數組或者 Numpy 數組列表。
關於給 RNN 傳遞外部常量的說明
可以使用 RNN. call (以及 RNN.call)的 constants 關鍵字參數將「外部」常量傳遞給單元。 這要求 cell.call 方法接受相同的關鍵字參數 constants。 這些常數可用於調節附加靜態輸入(不隨時間變化)上的單元轉換,也可用於注意力機制。
舉例說明:
在訓練模型之前,我們需要配置學習過程,這是通過compile方法完成的。
他接收三個參數:優化器 opt
Ⅱ 手機上運行的深度神經網路模型-MobileNet
文章引用自《 從MobileNet看輕量級神經網路的發展 》,詳情請點擊原文觀看
前 言
隨著深度學習的火熱,計算機視覺領域內的卷積神經網路模型也層出不窮。從1998年的LeNet,到2012年引爆深度學習熱潮的AlexNet,再到後來2014年的VGG,2015年的ResNet,深度學習網路模型在圖像處理中應用的效果越來越好。神經網路體積越來越大,結構越來越復雜,預測和訓練需要的硬體資源也逐步增多,往往只能在高算力的伺服器中運行深度學習神經網路模型。移動設備因硬體資源和算力的限制,很難運行復雜的深度學習網路模型。
深度學習領域內也在努力促使神經網路向小型化發展。在保證模型准確率的同時體積更小,速度更快。到了2016年直至現在,業內提出了SqueezeNet、ShuffleNet、NasNet、MnasNet以及MobileNet等輕量級網路模型。這些模型使移動終端、嵌入式設備運行神經網路模型成為可能。而MobileNet在輕量級神經網路中較具代表性。
谷歌在2019年5月份推出了最新的MobileNetV3。新版MobileNet使用了更多新特性,使得MobileNet非常具有研究和分析意義,本文將對MobileNet進行詳細解析。
MobileNet的優勢
MobileNet網路擁有更小的體積,更少的計算量,更高的精度。在輕量級神經網路中擁有極大的優勢。
1
更小的體積
MobileNet相比經典的大型網路,參數量明顯更少,參數量越少模型體積越小。
2
更少的計算量
MobileNet優化網路結構使模型計算量成倍下降。
3
更高的准確率
MobileNet憑借網路結構優化,在更少的參數及更少的計算量情況下,網路精度反而超過了部分大型神經網路。在最新的MobileNetV3-Large中,實現ImageNet數據集Top1准確率達到75.2%。
4
更快的速度
使用Google Pixel-1手機測試,MobileNet各版本都能保持運行時間在120ms以下,最新版MobileNetV3-Large運行時間達到66ms,參數量和計算量更低的MobileNetV3-Small更是能達到22ms;GoogleNet運行速度約為250ms,而VGG-16由於一次性需要載入至內存的空間已超過500MB,手機系統會報內存溢出錯誤導致無法運行。
5
多種應用場景
MobileNet可以在移動終端實現眾多的應用,包括目標檢測,目標分類,人臉屬性識別和人臉識別等。
MobileNet各版本介紹
1
MobileNetV1網路結構
整個網路不算平均池化層與softmax層,共28層;
在整個網路結構中步長為2的卷積較有特點,卷積的同時充當下采樣的功能;
第一層之後的26層都為深度可分離卷積的重復卷積操作;
每一個卷積層(含常規卷積、深度卷積、逐點卷積)之後都緊跟著批規范化和ReLU激活函數;
最後一層全連接層不使用激活函數。
2
MobileNetV2網路結構
MobileNetV2中主要引入線性瓶頸結構和反向殘差結構。
MobileNetV2網路模型中有共有17個Bottleneck層(每個Bottleneck包含兩個逐點卷積層和一個深度卷積層),一個標准卷積層(conv),兩個逐點卷積層(pw conv),共計有54層可訓練參數層。MobileNetV2中使用線性瓶頸(Linear Bottleneck)和反向殘差(Inverted Resials)結構優化了網路,使得網路層次更深了,但是模型體積更小,速度更快了。
3
MobileNetV3網路結構
MobileNetV3分為Large和Small兩個版本,Large版本適用於計算和存儲性能較高的平台,Small版本適用於硬體性能較低的平台。
Large版本共有15個bottleneck層,一個標准卷積層,三個逐點卷積層。
Small版本共有12個bottleneck層,一個標准卷積層,兩個逐點卷積層。
MobileNetV3中引入了5×5大小的深度卷積代替部分3×3的深度卷積。引入Squeeze-and-excitation(SE)模塊和h-swish(HS)激活函數以提高模型精度。結尾兩層逐點卷積不使用批規范化(Batch Norm),MobileNetV3結構圖中使用NBN標識。
(圖片來源https://arxiv.org/pdf/1905.02244.pdf)
網路結構上相對於MobileNetV2的結尾部分做了優化,去除三個高階層,如上圖所示。去除後減少了計算量和參數量,但是模型的精度並沒有損失。
值得一提的是,不論是Large還是Small版本,都是使用神經架構搜索(NAS)技術生成的網路結構。
4
MobileNet各版本特性
MobileNet實現計算量減小、參數量減少的同時保證了較高的准確率,這和其擁有的特性息息相關:
MobileNetV1提出的特性
MobileNetV2提出的特性
MobileNetV3提出的特性
MobileNet各個版本擁有的特性匯總
下文將對上表中的各個特性詳細闡述。
MobileNet的特性詳解
1
深度可分離卷積
從MobileNetV1開始,到V2、V3的線性瓶頸結構都大量使用了深度可分離卷積。
深度可分離卷積(Depthwise Separable Convolution)是一種卷積結構。它是由一層深度卷積(Depthwise convolution)與一層逐點卷積(Pointwise Convolution)組合而成的,每一層卷積之後都緊跟著批規范化和ReLU激活函數。跟標准卷積的區別就是精度基本不變的情況下,參數與計算量都明顯減少。
深度卷積
深度卷積(Depthwise convolution, DW)不同於常規卷積操作,深度卷積中一個卷積核只有一維,負責一個通道,一個通道只被一個卷積核卷積;常規卷積每個卷積核的維度與輸入維度相同,每個通道單獨做卷積運算後相加。
以一張5x5x3(長和寬為5,RGB3通道)的彩色圖片舉例。每層深度卷積卷積核的數量與上一層的通道數相同(通道和卷積核一一對應)。設padding=1,stride=1,一個三通道的圖像經過運算後生成了3個特徵圖,如下圖所示:
深度卷積完成後的輸出特徵圖通道數與輸入層的通道數相同,無法擴展通道數。而且這種運算對輸入層的每個通道獨立進行卷積運算,沒有有效的利用不同通道在相同空間位置上的特徵信息。因此需要逐點卷積來將生成的特徵圖進行組合生成新的特徵圖。
逐點卷積
逐點卷積(Pointwise Convolution, PW)的運算與標准卷積運算非常相似。
逐點卷積卷積核大小為1×1xM(M為輸入數據的維度),每次卷積一個像素的區域。逐點卷積運算會將上一層的特徵圖在深度方向上進行加權組合,生成新的特徵圖,新的特徵圖的大小與輸入數據大小一致;然後組合各通道的特徵圖,以較少的計算量進行降維或升維操作(改變輸出數據的維度)。
以一張5x5x3(長和寬為5,RGB3通道)的彩色圖片舉例,使用4個1x1x3的逐點卷積核進行卷積,逐點卷積運算後生成了4個特徵圖。這個例子是使用逐點卷積進行升維的操作,特徵圖從5x5x3 升維到5x5x4。如下圖所示:
深度可分離卷積結構解析
將深度卷積和逐點卷積組成深度可分離卷積後的示意圖,如下圖所示:
首先進行深度卷積操作,得出的特徵圖各通道之間是不關聯的。接著進行逐點卷積把深度卷積輸出的特徵圖各通道關聯起來。
深度可分離卷積使用了更小的空間代價(參數減少)和更少的時間代價(計算量更少)實現了標准卷積層一樣的效果(提取特徵)。
一般的設Df為輸入特徵圖邊長,Dk為卷積核邊長,特徵圖和卷積核均為長寬一致,輸入通道數為M,輸出通道數為N,則:
標准卷積計算量為:Df×Df×Dk×Dk×M×N
深度卷積的計算量為:Df×Df×Dk×Dk×M
逐點卷積的計算量為:Df×Df×M×N
上圖所示實現輸入特徵圖大小為5×5×3,輸出特成圖大小為5×5×4,設padding=1,stride=1,深度卷積卷積核大小為3×3,標准卷積也使用3×3尺寸卷積核。實現相同的卷積效果,參數量(不包含偏置)與計算量對比如下表所示:
深度可分離卷積的演變
事實上深度可分離卷積不是在MobileNetV1中第一次提出的,而是在2016年由谷歌的Xception網路結構中提出的。MobileNetV1在Xception的基礎上,對深度可分離卷積進行了改進,做到了計算量與參數量的下降:
假定M為輸入層的通道數,N為輸出層的通道數。
Xcenption的深度可分離卷積是由輸入參數開始,使用1x1xMxN卷積將輸入層的通道數轉換為目標通道數,再通過3x3x1卷積核對每個通道進行卷積,每次卷積過後使用ReLU進行激活。
MobileNetV1的深度可分離卷積則是先使用3x3x1xM對輸入層的每個通道分別卷積,之後通過1x1xMxN將輸入層通道數轉換為輸出層通道數,每次卷積過後做一次批規范化操作,再使用ReLU進行激活。
這里我們使用MobileNetV1網路結構的第一個深度可分離卷積層來舉例,輸入層維度為112x112x32,輸出層維度為112x112x64,Xception與MobileNet的深度可分離卷積的計算量與參數個數對比如下表:
由此可知將PW卷積與DW卷積的順序調整後,優化了網路的空間復雜度和時間復雜度。
2
寬度因子
MobileNet本身的網路結構已經比較小並且執行延遲較低,但為了適配更定製化的場景,MobileNet提供了稱為寬度因子(Width Multiplier)的超參數給我們調整。寬度因子在MobileNetV1、V2、V3都可以運用。
通過寬度因子,可以調整神經網路中間產生的特徵的大小,調整的是特徵數據通道數大小,從而調整了運算量的大小。
寬度因子簡單來說就是新網路中每一個模塊要使用的卷積核數量相較於標準的MobileNet比例。對於深度卷積結合1x1方式的卷積核,計算量為:
算式中α即為寬度因子,α常用的配置為1,0.75,0.5,0.25;當α等於1時就是標準的MobileNet。通過參數α可以非常有效的將計算量和參數數量約減到α的平方倍。
下圖為MobileNetV1使用不同α系數進行網路參數的調整時,在ImageNet上的准確率、計算量、參數數量之間的關系(每一個項中最前面的數字表示α的取值)。
(數據來源https://arxiv.org/pdf/1704.04861.pdf)
可以看到當輸入解析度固定為224x224時,隨著寬度因子的減少,模型的計算量和參數越來越小。從上表可以看到, 0.25 MobileNet的正確率比標准版1.0MobileNet低20%,但計算量和參數量幾乎只有標准版1.0MobileNet計算量、參數量的10%!對於計算資源和存儲資源都十分緊張的移動端平台,可以通過α寬度因子調節網路的餐數量是非常實用的,在真正使用時我們可以按需調整α寬度因子達到准確率與性能的平衡。
3
解析度因子
MobileNet還提供了另一個超參數解析度因子(Resolution Multiplier)供我們自定義網路結構,解析度因子同樣在MobileNetV1、V2、V3都可以運用。
解析度因子一般用β來指代,β的取值范圍在(0,1]之間,是作用於每一個模塊輸入尺寸的約減因子,簡單來說就是將輸入數據以及由此在每一個模塊產生的特徵圖都變小了,結合寬度因子α,深度卷積結合1x1方式的卷積核計算量為:
下圖為MobileNetV1使用不同的β系數作用於標准MobileNet時,在ImageNet上對精度和計算量的影響(α固定1.0)
(數據來源https://arxiv.org/pdf/1704.04861.pdf)
上圖中的 224、192、160、128 對應的解析度因子分別為 1、 6/7、5/7、4/7。
β=1時,輸入圖片的解析度為224x224,卷積後的圖像大小變化為: 224x224 、112x112、56x56、28x28、14x14、7x7。
β= 6/7時,輸入圖片的解析度為192x192,卷積後各層特徵圖像大小變化為:192x192、96x96、48x48、24x24、12x12、6x6。
卷積特徵圖像的大小變化不會引起參數量的變化,只改變模型M-Adds計算量。上圖中 224解析度模型測試ImageNet數據集准確率為70.6%,192解析度的模型准確率為69.1%,但是M-Adds計算量減少了151M,對移動平台計算資源緊張的情況下,同樣可以通過β解析度因子調節網路輸入特徵圖的解析度,做模型精度與計算量的取捨。
4
規范化
深度學習中的規范化操作(Normalization),有助於加快基於梯度下降法或隨機梯度下降法模型的收斂速度,提升模型的精度,規范化的參數能夠提升模型泛化能力,提高模型的可壓縮性。
按照規范化操作涉及對象的不同可以分為兩大類,一類是對輸入值進行規范化操作,比如批規范化(Batch Normalization)、層規范化(Layer Normalization)、實例規范化(Instance Normalization)、組規范化(Group Normalization)方法都屬於這一類。另外一類是對神經網路中參數進行規范化操作,比如使用L0,L1范數。
批規范化
批規范化(Batch Normalization)幾乎存在於MobileNetV1、V2、V3的每個卷積層的後面,目的是加快訓練收斂速度,提升准確率。
批規范化是一種對數值的特殊函數變換方法,也就是說假設原始的某個數值是 x,套上一個起到規范化作用的函數,對規范化之前的數值 x 進行轉換,形成一個規范化後的數值,即:
所謂規范化,是希望轉換後的數值滿足一定的特性,至於對數值具體如何變換,跟規范化目標有關,不同的規范化目標導致具體方法中函數所採用的形式不同。通過自適應的重新參數化的方法,克服神經網路層數加深導致模型難以訓練的問題。
參數規范化
參數規范化(Weight Normalization, WN)是規范化的一種, 通過人為的設定稀疏演算法,去除模型中多餘的參數(置為0)使得模型參數稀疏化,可以通過L1範式實現。
參數規范化是防止模型過分擬合訓練數據。當訓練一批樣本的時候,隨著訓練的推移模型會越來越趨向於擬合樣本數據。因為參數太多,會導致模型復雜度上升,容易過擬合。
需要保證模型"簡單"的基礎上最小化訓練誤差,這樣得到的參數才具有好的泛化性能(也就是測試誤差也小),而模型"簡單"就是通過規則函數來實現的。
如上圖所示,左側分類明顯的是欠擬合,模型並沒有能夠擬合數據。中間圖示為合適的擬合,右邊圖示是過擬合,模型在訓練樣本中擬合度是很好的,但是卻違背了特徵分類規律,在新的測試樣本中表現糟糕,影響模型的泛化能力。顯然右側模型在訓練是受到額外參數干擾。參數規則化能夠使參數稀疏,減少額外參數的干擾,提高泛化能力。
模型擁有稀疏的參數(模型中有大量參數為0),也有利於通過壓縮演算法壓縮模型的大小。
5
線性瓶頸
線性瓶頸英文為Linear Bottleneck,是從Bottleneck結構演變而來的,被用於MobileNetV2與V3。
Bottleneck結構首次被提出是在ResNet網路中。該結構第一層使用逐點卷積,第二層使用3×3大小卷積核進行深度卷積,第三層再使用逐點卷積。MobileNet中的瓶頸結構最後一層逐點卷積使用的激活函數是Linear,所以稱其為線性瓶頸結構(Linear Bottleneck)。線性瓶頸結構有兩種,第一種是步長為1時使用殘差結構,第二種是步長為2時不使用殘差結構。
其中輸入通道數為M,擴大倍數系數為T。T的值為大於0 的正數,當 0<T<1時,第一層逐點卷積起到的作用是降維。當 1<T時,第一層逐點卷積起到的作用是升維。
第二層為深度卷積,輸入通道數 = 輸出通道數 = M×T。
第三層為逐點卷積,作用是關聯深度卷積後的特徵圖並輸出指定通道數N。
線性瓶頸結構相對標准卷積能夠減少參數數量,減少卷積計算量。從空間和時間上優化了網路。
6
反向殘差
MobileNetV2中以ResNet的殘差(Resials)結構為基礎進行優化,提出了反向殘差(Inverted Resials)的概念,之後也同樣運用與MobileNetV3中。
ResNet中提出的殘差結構解決訓練中隨著網路深度增加而出現的梯度消失問題,使反向傳播過程中深度網路的淺層網路也能得到梯度,使淺層網路的參數也可訓練,從而增加特徵表達能力。
ResNet的殘差結構實際是在線性瓶頸結構的基礎上增加殘差傳播。如下圖所示:
ResNet中的殘差結構使用第一層逐點卷積降維,後使用深度卷積,再使用逐點卷積升維。
MobileNetV2版本中的殘差結構使用第一層逐點卷積升維並使用Relu6激活函數代替Relu,之後使用深度卷積,同樣使用Relu6激活函數,再使用逐點卷積降維,降維後使用Linear激活函數。這樣的卷積操作方式更有利於移動端使用(有利於減少參數與M-Adds計算量),因維度升降方式與ResNet中的殘差結構剛好相反,MobileNetV2將其稱之為反向殘差(Inverted Resials)。
7
5x5 的深度卷積
MobileNetV3中,深度卷積大量使用5x5大小的卷積核。這是因為使用神經結構搜索(NAS)技術計算出的MobileNetV3網路結構的過程中,發現了在深度卷積中使用5x5大小的卷積核比使用3x3大小的卷積核效果更好,准確率更高。關於NAS技術將會在下文的單獨章節中做介紹。
8
Squeeze-and-excitation 模塊
Squeeze-and-Excitation模塊(簡稱SE模塊)的首次提出是在2017年的Squeeze-and-Excitation Networks(SENet)網路結構中,在MNasNet中進行了改進,之後在MobileNetV3中大量使用。研究人員期望通過精確的建模卷積特徵各個通道之間的作用關系來改善網路模型的表達能力。為了達到這個期望,提出了一種能夠讓網路模型對特徵進行校準的機制,使得有效的權重大,無效或效果小的權重小的效果,這就是SE模塊。
(圖片來源https://arxiv.org/pdf/1905.02244.pdf)
如上圖,MobileNetV3的SE模塊被運用在線性瓶頸結構最後一層上,代替V2中最後的逐點卷積,改為先進行SE操作再逐點卷積。這樣保持了網路結構每層的輸入和輸出,僅在中間做處理,類似於軟體開發中的鉤子。
SE模塊結構詳解
下圖表示一個SE 模塊。主要包含Squeeze和Excitation兩部分。W,H表示特徵圖寬,高。C表示通道數,輸入特徵圖大小為W×H×C。
壓縮(Squeeze)
第一步是壓縮(Squeeze)操作,如下圖所示
這個操作就是一個全局平均池化(global average pooling)。經過壓縮操作後特徵圖被壓縮為1×1×C向量。
激勵(Excitation)
接下來就是激勵(Excitation)操作,如下圖所示
由兩個全連接層組成,其中SERatio是一個縮放參數,這個參數的目的是為了減少通道個數從而降低計算量。
第一個全連接層有C*SERatio個神經元,輸入為1×1×C,輸出1×1×C×SERadio。
第二個全連接層有C個神經元,輸入為1×1×C×SERadio,輸出為1×1×C。
scale操作
最後是scale操作,在得到1×1×C向量之後,就可以對原來的特徵圖進行scale操作了。很簡單,就是通道權重相乘,原有特徵向量為W×H×C,將SE模塊計算出來的各通道權重值分別和原特徵圖對應通道的二維矩陣相乘,得出的結果輸出。
這里我們可以得出SE模塊的屬性:
參數量 = 2×C×C×SERatio
計算量 = 2×C×C×SERatio
總體來講SE模塊會增加網路的總參數量,總計算量,因為使用的是全連接層計算量相比卷積層並不大,但是參數量會有明顯上升,所以MobileNetV3-Large中的總參數量比MobileNetV2多了2M。
MobileNetV3中的SE模塊
SE模塊的使用是很靈活的,可以在已有網路上添加而不打亂網路原有的主體結構。
ResNet中添加SE模塊形成SE-ResNet網路,SE模塊是在bottleneck結構之後加入的,如下圖左邊所示。
MobileNetV3版本中SE模塊加在了bottleneck結構的內部,在深度卷積後增加SE塊,scale操作後再做逐點卷積,如上圖右邊所示。MobileNetV3版本的SERadio系數為0.25。使用SE模塊後的MobileNetV3的參數量相比MobileNetV2多了約2M,達到5.4M,但是MobileNetV3的精度得到了很大的提升,在圖像分類和目標檢測中准確率都有明顯提升。
9
h-swish激活函數
MobileNetV3中發現swish激活函數能夠有效提高網路的精度,但是swish的計算量太大了,並不適合輕量級神經網路。MobileNetV3找到了類似swish激活函數但是計算量卻少很多的替代激活函數h-swish(hard version of swish)如下所示:
sigmoid、h-sigmoid、swish、h-swish激活函數的比較:
(圖片來源https://arxiv.org/pdf/1905.02244.pdf)
這種非線性在保持精度的情況下帶來了很多優勢,首先ReLU6在眾多軟硬體框架中都可以實現,其次量化時避免了數值精度的損失,運行快。這一非線性改變將模型的延時增加了15%。但它帶來的網路效應對於精度和延時具有正向促進,剩下的開銷可以通過融合非線性與先前層來消除。
Ⅲ 人工智慧:什麼是人工神經網路
許多 人工智慧 計算機系統的核心技術是人工神經網路(ANN),而這種網路的靈感來源於人類大腦中的生物結構。
通過使用連接的「神經元」結構,這些網路可以通過「學習」並在沒有人類參與的情況下處理和評估某些數據。
這樣的實際實例之一是使用人工神經網路(ANN)識別圖像中的對象。在構建一個識別「貓「圖像的一個系統中,將在包含標記為「貓」的圖像的數據集上訓練人工神經網路,該數據集可用作任何進行分析的參考點。正如人們可能學會根據尾巴或皮毛等獨特特徵來識別狗一樣,人工神經網路(ANN)也可以通過將每個圖像分解成不同的組成部分(如顏色和形狀)進行識別。
實際上,神經網路提供了位於託管數據之上的排序和分類級別,可基於相似度來輔助數據的聚類和分組。可以使用人工神經網路(ANN)生成復雜的垃圾郵件過濾器,查找欺詐行為的演算法以及可以精確了解情緒的客戶關系工具。
人工神經網路如何工作
人工神經網路的靈感來自人腦的神經組織,使用類似於神經元的計算節點構造而成,這些節點沿著通道(如神經突觸的工作方式)進行信息交互。這意味著一個計算節點的輸出將影響另一個計算節點的處理。
神經網路標志著人工智慧發展的巨大飛躍,在此之前,人工智慧一直依賴於使用預定義的過程和定期的人工干預來產生所需的結果。人工神經網路可以使分析負載分布在多個互連層的網路中,每個互連層包含互連節點。在處理信息並對其進行場景處理之後,信息將傳遞到下一個節點,然後向下傳遞到各個層。這個想法是允許將其他場景信息接入網路,以通知每個階段的處理。
單個「隱藏」層神經網路的基本結構
就像漁網的結構一樣,神經網路的一個單層使用鏈將處理節點連接在一起。大量的連接使這些節點之間的通信得到增強,從而提高了准確性和數據處理吞吐量。
然後,人工神經網路將許多這樣的層相互疊放以分析數據,從而創建從第一層到最後一層的輸入和輸出數據流。盡管其層數將根據人工神經網路的性質及其任務而變化,但其想法是將數據從一層傳遞到另一層,並隨其添加附加的場景信息。
人腦是用3D矩陣連接起來的,而不是大量堆疊的圖層。就像人類大腦一樣,節點在接收到特定刺激時會在人工神經網路上「發射」信號,並將信號傳遞到另一個節點。但是,對於人工神經網路,輸入信號定義為實數,輸出為各種輸入的總和。
這些輸入的值取決於它們的權重,該權重用於增加或減少與正在執行的任務相對應的輸入數據的重要性。其目標是採用任意數量的二進制數值輸入並將其轉換為單個二進制數值輸出。
更復雜的神經網路提高了數據分析的復雜性
早期的神經網路模型使用淺層結構,其中只使用一個輸入和輸出層。而現代的系統由一個輸入層和一個輸出層組成,其中輸入層首先將數據輸入網路,多個「隱藏」層增加了數據分析的復雜性。
這就是「深度學習」一詞的由來——「深度」部分專門指任何使用多個「隱藏」層的神經網路。
聚會的例子
為了說明人工神經網路在實際中是如何工作的,我們將其簡化為一個實際示例。
想像一下你被邀請參加一個聚會,而你正在決定是否參加,這可能需要權衡利弊,並將各種因素納入決策過程。在此示例中,只選擇三個因素——「我的朋友會去嗎?」、「聚會地點遠嗎?」、「天氣會好嗎?」
通過將這些考慮因素轉換為二進制數值,可以使用人工神經網路對該過程進行建模。例如,我們可以為「天氣」指定一個二進制數值,即『1'代表晴天,『0'代表惡劣天氣。每個決定因素將重復相同的格式。
然而,僅僅賦值是不夠的,因為這不能幫助你做出決定。為此需要定義一個閾值,即積極因素的數量超過消極因素的數量。根據二進制數值,合適的閾值可以是「2」。換句話說,在決定參加聚會之前,需要兩個因素的閾值都是「1」,你才會決定去參加聚會。如果你的朋友要參加聚會(『1'),並且天氣很好(『1'),那麼這就表示你可以參加聚會。
如果天氣不好(『0'),並且聚會地點很遠(『0'),則達不到這一閾值,即使你的朋友參加(『1'),你也不會參加聚會。
神經加權
誠然,這是神經網路基本原理的一個非常基本的例子,但希望它有助於突出二進制值和閾值的概念。然而,決策過程要比這個例子復雜得多,而且通常情況下,一個因素比另一個因素對決策過程的影響更大。
要創建這種變化,可以使用「神經加權」——-通過乘以因素的權重來確定因素的二進制值對其他因素的重要性。
盡管示例中的每個注意事項都可能使你難以決策,但你可能會更重視其中一個或兩個因素。如果你不願意在大雨中出行去聚會,那惡劣的天氣將會超過其他兩個考慮因素。在這一示例中,可以通過賦予更高的權重來更加重視天氣因素的二進制值:
天氣= w5
朋友= w2
距離= w2
如果假設閾值現在已設置為6,則惡劣的天氣(值為0)將阻止其餘輸入達到所需的閾值,因此該節點將不會「觸發」(這意味著你將決定不參加聚會)。
雖然這是一個簡單的示例,但它提供了基於提供的權重做出決策的概述。如果要將其推斷為圖像識別系統,則是否參加聚會(輸入)的各種考慮因素將是給定圖像的折衷特徵,即顏色、大小或形狀。例如,對識別狗進行訓練的系統可以對形狀或顏色賦予更大的權重。
當神經網路處於訓練狀態時,權重和閾值將設置為隨機值。然後,當訓練數據通過網路傳遞時將不斷進行調整,直到獲得一致的輸出為止。
神經網路的好處
神經網路可以有機地學習。也就是說,神經網路的輸出結果並不受輸入數據的完全限制。人工神經網路可以概括輸入數據,使其在模式識別系統中具有價值。
他們還可以找到實現計算密集型答案的捷徑。人工神經網路可以推斷數據點之間的關系,而不是期望數據源中的記錄是明確關聯的。
它們也可以是容錯的。當神經網路擴展到多個系統時,它們可以繞過無法通信的缺失節點。除了圍繞網路中不再起作用的部分進行路由之外,人工神經網路還可以通過推理重新生成數據,並幫助確定不起作用的節點。這對於網路的自診斷和調試非常有用。
但是,深度神經網路提供的最大優勢是能夠處理和聚類非結構化數據,例如圖片、音頻文件、視頻、文本、數字等數據。在分析層次結構中,每一層節點都在前一層的輸出上進行訓練,深層神經網路能夠處理大量的這種非結構化數據,以便在人類處理分析之前找到相似之處。
神經網路的例子
神經網路應用還有許多示例,可以利用它從復雜或不精確數據中獲得見解的能力。
圖像識別人工神經網路可以解決諸如分析特定物體的照片等問題。這種演算法可以用來區分狗和貓。更重要的是,神經網路已經被用於只使用細胞形狀信息來診斷癌症。
近30年來,金融神經網路被用於匯率預測、股票表現和選擇預測。神經網路也被用來確定貸款信用評分,學習正確識別良好的或糟糕的信用風險。而電信神經網路已被電信公司用於通過實時評估網路流量來優化路由和服務質量。