Deep Learning

Deep Learning

1、Framework

1. MobileNet

將標準卷積拆分紅兩部,第一次卷積不進行channel間卷積(逐層卷積:depthwise convolution),即一個輸入channel對應一個卷積濾波器;第二次只進行channel間卷積,即便用1x1卷積核。如圖,原來的參數個數爲,如今變爲,參數個數總體減小N倍。html

MobileNet

MobileNet

2. ShuffleNet

之前Inception網絡group時,各個通道之間都是獨立的,如今將各個通道打亂,加強通道間的交互信息。python

ShuffleNet

ShuffleNet

ShuffleNet使用相似MobileNet的網絡,就是增長了通道間的shuffle,去掉了ReLU。先1x1 pointwise conv, 而後shuffle, 再進行3x3 Detpthwise conv,做者說1x1, 3x3的順序不重要。git

ShuffleNet Unit

ShuffleNet Unit

實驗結果:github

performance

performance

相對於MobileNet,ShuffleNet的前向計算量不只有效地獲得了減小,並且分類錯誤率也有明顯提高,驗證了網絡的可行性。算法

3. Network in Network

利用 Mlpconv 和 全局平均 pooling 創建了 Network in Network 網絡結構。數據庫

Mlpconv: mlpcon 指的是: multilayer perceptron + convolution;express

mlpconv

mlpconv

過程以下:
假設上面的第三個圖中的輸入爲2*(4 4), 輸出爲2 * (33)時:api

  1. 第一層的卷積核大小爲2*2, 步長爲1, 輸入爲2*(4 *4), 輸出爲 4*(3*3);
  2. 第二層的卷積核大小爲1*1, 步長爲1, 輸入爲4*(3 *3), 輸出爲 3*(3*3);
  3. 第三層的卷積核大小爲1*1, 步長爲1, 輸入爲3*(3 *3), 輸出爲 2*(3*3);

後面兩層的卷積核大小爲1x1,意味着每一個卷積核只進行不一樣通道間的累加,而不進行同一個Feature Map上的卷積,保證Feature Map大小不變。整個mlpconv的效果就至關於使用了第一層的卷積核大小,第三層的通道數的一層卷積。但好處是複雜的結構增長了網絡的非線性,使網絡表徵非線性能力加強。文中也說明了 NIN比 maxout networks 更 non-linearity;網絡

mlpconv

mlpconv

全局平均池化:即每一個feature map平均池化成一個值,若是有m個通道,就會生成一個m維的向量(傳統方法使用全鏈接層生成固定維度向量,但全鏈接層須要參數多,容易過擬合,dropout能夠緩解這個問題),而後使用softmax分類:架構

global average pooling

global average pooling

http://blog.csdn.net/diamonjoy_zone/article/details/70229148
http://www.javashuo.com/article/p-aeeyvnfj-u.html

4. Mask RCNN(ICCV 2017 Best paper)

Mask RCNN architecutre

Mask RCNN architecutre

原來的分割都是對整張圖片的全部目標進行多分類,輸入一張圖片,會輸出一張總體的mask,以下圖左邊。

做者如今用分類框來輔導分割,那麼如今在分類框內作分割只須要作二分類,減小其它的干擾。同時,做者將分類工做與分割工做進行解耦,分類和分割是兩個過程,先分類,在對每一個分類框進行分割。以下圖左邊所示。

mask rcnn

mask rcnn

http://blog.csdn.net/linolzhang/article/details/71774168

5. GoogleNet Inception

使用了1×1,3×3,5×5的卷積核,又由於pooling也是CNN成功的緣由之一,因此把pooling也算到了裏面,而後將結果在拼起來。

Inception

Inception

發展:
Inception V1, V2, V3, V4
Inception-Resnet V1, V2

Inception V1——構建了1x一、3x三、5x5的 conv 和3x3的 pooling 的分支網絡,同時使用 MLPConv 和全局平均池化,擴寬卷積層網絡寬度,增長了網絡對尺度的適應性;

Inception V2——提出了 Batch Normalization,代替 Dropout 和 LRN,其正則化的效果讓大型卷積網絡的訓練速度加快不少倍,同時收斂後的分類準確率也能夠獲得大幅提升,同時學習 VGG 使用兩個3´3的卷積核代替5´5的卷積核,在下降參數量同時提升網絡學習能力;

Inception V3——引入了 Factorization,將一個較大的二維卷積拆成兩個較小的一維卷積,好比將3x3卷積拆成1x3卷積和3x1卷積,一方面節約了大量參數,加速運算並減輕了過擬合,同時增長了一層非線性擴展模型表達能力,除了在 Inception Module 中使用分支,還在分支中使用了分支(Network In Network In Network);

Inception V4——研究了 Inception Module 結合 Residual Connection,結合 ResNet 能夠極大地加速訓練,同時極大提高性能,在構建 Inception-ResNet 網絡同時,還設計了一個更深更優化的 Inception v4 模型,能達到相媲美的性能。

http://blog.csdn.net/stdcoutzyx/article/details/51052847
http://blog.csdn.net/yuanchheneducn/article/details/53045551

6. SqueezeNet

做者提出了一個相似inception的網絡單元結構,取名爲fire module。使用這個模塊代替原始的3x3卷積,一個fire module 包含一個squeeze 卷積層(只包含1x1卷積核)和一個expand卷積層(包含1x1和3x3卷積核)。其中,squeeze層借鑑了inception的思想,利用1x1卷積核來下降輸入到expand層中3x3卷積核的輸入通道數。

Squeeze

Squeeze

相比傳統的壓縮方法,SqueezeNet能在保證精度不損(甚至略有提高)的狀況下,達到最大的壓縮率,將原始AlexNet從240MB壓縮至4.8MB,而結合Deep Compression後更能達到0.47MB,徹底知足了移動端的部署和低帶寬網絡的傳輸。

perormance

perormance

7. Deep Compression

《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》

進行權重文件壓縮:

流程

流程

一、Pruning(權值剪枝)
二、Quantization (權值量化) codebook
三、Huffman encoding(霍夫曼編碼)

http://blog.csdn.net/QcloudCommunity/article/details/77719498

8. MoblieNet-SSD

SSD的MobileNet實現,caffemodel大小隻有22.1M左右。

9. RetinaNet, Focol Loss (ICCV 2017 Best Student paper)

深度學習目標檢測主要有兩種方法:

  • 兩步檢測,如RCNN、Faster RCNN,這樣的檢測效果好,但速度慢
  • 一步檢測,如YOLO、SSD,這樣的檢測速度快,但效果稍差。

做者改進了損失函數,使得在效果、速度上都取得了較好的效果。

二分類問題的原始交叉熵損失函數:

cross entropy

cross entropy

做者作了兩方面改進,一個是針對樣本不均衡的問題,若是一個類別樣本少,它的權重就要大一些。做者用來調節樣本少的類,用一類的調節參數即爲

class imbanlance

class imbanlance

做者另外一方面在分類錯誤度上進行懲罰,分類偏離越大,懲罰的權重也應該越大。

classify factor

classify factor

雖然cross_entroy在設計上對分類偏離越大的樣本給予越大的損失,但做者想加入一個調節因子能夠加大調節力度。若是分類機率爲0.2, 那麼結果爲,能夠看見當分類正確機率越低,前面的調節因子能夠起到加大這種loss的做用;當分類正確機率接近1的時候,前面的調節因子就會很小,致使最後的損失函數變小,這正是想要的結果:懲罰大的分類偏差。

最後,做者結合二者,給出了最後的損失函數形式:

final expression

final expression

tensorflow實現:

import tensorflow as tf
from tensorflow.python.ops import array_ops

def focal_loss(prediction_tensor, target_tensor, weights=None, alpha=0.25, gamma=2):
    r"""Compute focal loss for predictions. Multi-labels Focal loss formula: FL = -alpha * (z-p)^gamma * log(p) -(1-alpha) * p^gamma * log(1-p) ,which alpha = 0.25, gamma = 2, p = sigmoid(x), z = target_tensor. Args: prediction_tensor: A float tensor of shape [batch_size, num_anchors, num_classes] representing the predicted logits for each class target_tensor: A float tensor of shape [batch_size, num_anchors, num_classes] representing one-hot encoded classification targets weights: A float tensor of shape [batch_size, num_anchors] alpha: A scalar tensor for focal loss alpha hyper-parameter gamma: A scalar tensor for focal loss gamma hyper-parameter Returns: loss: A (scalar) tensor representing the value of the loss function """
    sigmoid_p = tf.nn.sigmoid(prediction_tensor)
    zeros = array_ops.zeros_like(sigmoid_p, dtype=sigmoid_p.dtype)
    
    # For poitive prediction, only need consider front part loss, back part is 0;
    # target_tensor > zeros <=> z=1, so poitive coefficient = z - p.
    pos_p_sub = array_ops.where(target_tensor > zeros, target_tensor - sigmoid_p, zeros)
    
    # For negative prediction, only need consider back part loss, front part is 0;
    # target_tensor > zeros <=> z=1, so negative coefficient = 0.
    neg_p_sub = array_ops.where(target_tensor > zeros, zeros, sigmoid_p)
    per_entry_cross_ent = - alpha * (pos_p_sub ** gamma) * tf.log(tf.clip_by_value(sigmoid_p, 1e-8, 1.0)) \
                          - (1 - alpha) * (neg_p_sub ** gamma) * tf.log(tf.clip_by_value(1.0 - sigmoid_p, 1e-8, 1.0))
    return tf.reduce_sum(per_entry_cross_ent)

這個代碼是用來作目標檢測,主要計算了兩部分loss。

回顧:
進行多目標分類的loss是softmax cross entropy,公式以下:

其中是one_hot形式。

sigmoid二分類損失函數以下:

這裏面的是標量,0或者1,實際上若是表示成one_hot格式,也可使用softmax cross entropy 表示損失函數。

obj_loss:
既然包含目標,進行多目標分類,懲罰機率不爲1的以下:

再乘上,得:

再乘上誤分較大的懲罰:

noobj_loss:
不包含目標,須要懲罰機率不爲0的:

再乘上,得:

再乘上誤分較大的懲罰:

最終loss:
結合obj_loss和noobj_loss,能夠獲得最後的loss以下:

代碼中將分別將標籤乘進去變成了pos_p_subneg_p_sub,也就之後最後的代碼:

per_entry_cross_ent = - alpha * (pos_p_sub ** gamma) * tf.log(tf.clip_by_value(sigmoid_p, 1e-8, 1.0)) \
                          - (1 - alpha) * (neg_p_sub ** gamma) * tf.log(tf.clip_by_value(1.0 - sigmoid_p, 1e-8, 1.0))

若平時只是多分類任務,則沒有第二項的,則損失函數是簡單的。如今由於是目標檢測,因此包含了沒有目標的樣本,須要懲罰這部分樣本,須要加入第二項。

10. FCN(Fully Convolutional Networks)全卷積網絡

所有使用卷積層,不使用全鏈接層。這樣能夠下降全鏈接層的參數,而且能夠接受不一樣大小的圖片作爲輸入。
而且通過一個反捲積,能夠進行像素級的分割。

fcn for segment

fcn for segment

deconv,上採樣方法:

upsampling

upsampling

http://blog.csdn.net/u010678153/article/details/48676195
http://www.javashuo.com/article/p-crnfblqx-gk.html

11. FPN

SSD採起相似(c)的作法,做者利用從底層Feature Map進行上採樣,而後再和對應層的特徵進行融合再進行預測。

FPN

FPN

爲了保證和上採樣的通道數同樣,使用一個1x1卷積對以前的特徵圖進行卷積。

fusion

fusion

12. Relation Networks for Object Detection

原來的目標檢測都是針對單個目標的特徵進行bbox, class score,沒有考慮目標以前的關係。做者提出一種關係網絡,能夠在深度網絡里加入關係。

關係

關係

對原來的外觀特徵加入了與其它proposal的realtion,把這些realtion拼接在原始外觀特徵的後面,造成最後的特徵。

總體的架構以下圖(a)所示,在特徵拼接以後加一個全鏈接層。圖(b)在最後添加了一個duplicate removal 網絡以代替NMS。

architecture

architecture

做者把duplicate removal歸結成一個二分類問題,即對於每個gt box,只有一個detected box是被分紅correct,其餘的都是分紅duplicate。做者的duplicate removal network是接在classifier的輸出後面。該模塊的輸入包括object proposal的score vector(屬於各個類別的機率), bbox,以及proposal的特徵(典型的1024維)。

對於某一個object proposal的某一個類別,假設屬於這個類別的機率爲scorenscoren,首先通過一個rank embed模塊,即拿出其餘object proposal屬於該類別的score,進行排序,獲得第n個object proposal在排序中的下標(rank),做者特別說明了,使用rank值而不是直接score的值很是重要。而後將rank值映射到128維向量,同時將該proposal的特徵也映射到128維,將兩種128維的特徵相加以後做爲新的appearance feature,而後和bbox做爲relation module的輸入,獲得新的128維的輸出,和W_s作內積以後經過sigmoid獲得s_1,最終的correct的機率s=s_0 * s_1。總體流程如上圖(b)所示。

思考:
無論多少維的特徵,均可以與一個W權重相乘,映射到任何維度,作embeding。反正W能夠經過網絡學習到,但映射維度要如何選擇呢。

http://blog.csdn.net/yaoqi_isee/article/details/78696954

Face Recognition

face++: 使用從網絡蒐集的500萬張人臉圖片訓練深度網絡模型。在lfw數據集上有用,在現實生活中效果仍是不行
baidu: 在人臉的各個區域分別利用神經網絡提取特徵,提取到的特徵經過metric learning降維到128維。
pose+shape+expression augmentation: face++,DeepID,FaceNet等須要基於百萬級人臉圖像的訓練才能達到高精度。而蒐集百萬級人臉數據所耗費的人力,物力,財力是很大的,因此商業公司使用的圖像數據庫是不公開的。採用了新的人臉數據擴增方法。對現有公共數據庫人臉圖像,從pose,shape和expression三個方面合成新的人臉圖像,極大的擴增數據量。
CNN-3DMM estimation: 他們採用了卷積神經網絡(CNN)來根據輸入照片來調節三維人臉模型的臉型和紋理參數,利用3D重建模型擴充人臉。
FR+FCN: 與當前使用2d環境或者3d信息來進行人臉重建的方法不一樣,該方法直接從人臉圖像之中學習到圖像中的規則觀察體(canonical view,標準正面人臉圖像)。做者開發了一種從個體照片中自動選擇/合成canonical-view的方法。

第一類:face++,DeepFace,DeepID,FaceNet和baidu。他們方法的核心是蒐集大數據,經過更多更全的數據集讓模型學會去識別人臉的多樣性。這類方法適合百度/騰訊/谷歌等大企業,將來能夠蒐集更多更全的訓練數據集。數據集包擴同一個體不一樣年齡段的照片,不一樣人種的照片,不一樣類型(美醜等)。經過更全面的數據,提升模型對現場應用中人臉差別的適應能力。
第二類:FR+FCN,pose+shape+expression augmentation和CNN-3DMM estimation。這類方法採用的是合成的思路,經過3D模型等合成不一樣類型的人臉,增長數據集。這類方法操做成本更低,更適合推廣。其中,特別是CNN-3DMM estimation,做者作了很是出色的工做,同時提供了源碼,能夠進一步參考和深度研究。

https://zhuanlan.zhihu.com/p/24816781

1. FaceNet

Google提供FaceNet用於人臉識別,lfw準確率: 99.63%。

FaceNet主要工做是使用triplet loss,組成一個三元組,x表示一個樣例,表示和x同一類的樣例,表示和x不是同一類的樣例。
loss就是同類的距離(歐幾里德距離)減去異類的距離:

  • 若是<=0,則loss爲0;
  • 若是>0, 則代表同類距離要長,分類不正確,要計入loss中。

另外,加入一個,表示但願兩個距離之間的最小邊界,論文中設爲0.2,以下公式:

triplet loss

triplet loss

2. DeepFace

2014年,DeepFace是facebook提出的方法,這篇論文早於DeepID和FaceNet,但其所使用的方法在後面的論文中都有體現,可謂是早期的奠定之做。準確率:97.25%

3D人臉矯正,過程以下:
a. 人臉檢測,使用6個基點
b. 二維剪切,將人臉部分裁剪出來
c. 67個基點,而後Delaunay三角化,在輪廓處添加三角形來避免不連續
d. 將三角化後的人臉轉換成3D形狀
e. 三角化後的人臉變爲有深度的3D三角網
f. 將三角網作偏轉,令人臉的正面朝前。
g. 最後放正的人臉
h. 一個新角度的人臉(在論文中沒有用到)

3D人臉矯正

3D人臉矯正

將矯正後的人臉輸入神經網絡,網絡參數以下:
Conv:32個11×11×3的卷積核
max-pooling: 3×3, stride=2
Conv: 16個9×9的卷積核
Local-Conv: 16個9×9的卷積核,Local的意思是卷積核的參數不共享
Local-Conv: 16個7×7的卷積核,參數不共享
Local-Conv: 16個5×5的卷積核,參數不共享
Fully-connected: 4096維
Softmax: 4030維

後面三層都是使用參數不共享的卷積核,之因此使用參數不共享,有以下緣由:

  • 對齊的人臉圖片中,不一樣的區域會有不一樣的統計特徵,卷積的局部穩定性假設並不存在,因此使用相同的卷積核會致使信息的丟失
  • 不共享的卷積核並不增長抽取特徵時的計算量,而會增長訓練時的計算量
  • 使用不共享的卷積核,須要訓練的參數量大大增長,於是須要很大的數據量,然而這個條件本文恰好知足。

CNN

CNN

DeepFace與以後的方法的最大的不一樣點在於,DeepFace在訓練神經網絡前,使用了對齊方法。論文認爲神經網絡可以work的緣由在於一旦人臉通過對齊後,人臉區域的特徵就固定在某些像素上了,此時,能夠用卷積神經網絡來學習特徵。

針對一樣的問題,DeepID和FaceNet並無對齊,DeepID的解決方案是將一我的臉切成不少部分,每一個部分都訓練一個模型,而後模型聚合。FaceNet則是沒有考慮這一點,直接以數據量大和特殊的目標函數取勝。

在DeepFace論文中,只使用CNN提取到的特徵,這點卻是開後面之先河,後面的DeepID、FaceNet全都是使用CNN提取特徵了,不再談LBP了。

http://blog.csdn.net/stdcoutzyx/article/details/46776415

3. DeepID3

lfw準確率:99.53%。

借鑑了VGG net3和GoogLeNet4,使用了更深的網絡,引入了inception layer。網絡中還出現了連續兩個conv layer直接相連的狀況,這樣使得網絡具備更大的receptive fields和更復雜的nonlinearity。

http://blog.csdn.net/yiyouxian/article/details/52145727

2、Trick

1. 1x1卷積

1x1卷積,又叫elementwise conv,是在相同的一個位置點上進行不一樣通道間的權重累加。

CNN中,1X1卷積核到底有什麼做用呢?
1.實現跨通道的交互和信息整合
2.進行卷積核通道數的降維和升維

https://www.jianshu.com/p/ba51f8c6e348

同時,還有一種叫depthwise conv,它是一個卷積核只在一個輸入通道上進行卷積,不進行通道間的計算。

depthwise的tensorflow實現:

tf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,name=None,data_format=None)
input: [batch_size, h, w, in_channels]
output: [filter_width, filter_width, in_channels, channel_multiplier], channel_multiplier是輸出卷積乘子,即輸出的卷積通道數爲in_channels * channel_multiplier。
strides: 卷積步長
padding: 包括SAME, VALID
rate: 實現空洞卷積,空洞卷積的洞個數,若是rate是大於1的正數,stride必須等於1

http://blog.csdn.net/mao_xiao_feng/article/details/78003476

組合這兩種操做,能夠獲得一個完整的卷積操做,而參數的數量卻大大縮小,這就是MoblieNet的原理了。

2. parameter

google net 中的solver文件參數:

net: "models/bvlc_googlenet/train_val.prototxt"
test_iter: 1000 # test_iter * batch_size = test_size
test_interval: 4000 #每訓練多少次進行一次測試
test_initialization: false #取值爲true或者false,默認爲true,就是剛啓動就進行測試,false的話不進行第一次的測試。
display: 40 #每40次顯示一次loss
average_loss: 40 #取40次迭代平均loss顯示出來
base_lr: 0.01
lr_policy: "step"
stepsize: 320000 # 每隔stepsize下降學習速率,每隔stepsize,基礎學習速率*gamma
gamma: 0.96 #lr 更新參數,還有power
max_iter: 10000000
momentum: 0.9
weight_decay: 0.0002
snapshot: 40000
snapshot_prefix: "models/bvlc_googlenet/bvlc_googlenet"
solver_mode: GPU

Doing validation every 0.25 epoch may be OK. Just make sure that training loss and validation convergence at the same time.

0.25個epoch進行一次驗證,確保traning loss和validation loss都收斂。

solver參數的解析:

1. weight decay

爲了避免overfitting,通常會加上參數(w)正則項用來約束模型複雜度。weight decay用以控制約束項的做用大小。這時是學習率,是正則項係數,也多是這個所謂的weight decay。

weight decay

weight decay

有人會問有價值的weight是否是也會decay。其實BP算法本質能對下降error function意義不大的weight變的愈來愈小,對於如此小的值,能夠徹底discard(是否是想起了dropout,呵)。而真正解決問題的weight不會隨便被decay。

從原來的:

變爲:

就至關於對於權重進行了一次decay,再進行後面的參數更新,它會始一些做用不大的參數愈來愈小,避免參數過於複雜,形成過擬合;而有用的參數能夠經過權重更新較好的保留下來。

2. Learning Rate Decay:

計算學習率:

enter description here

enter description here

更直接的方法,每迭代1000次,學習率減小10倍

3. Momentum

動量(m),採用牛頓第二定律,慣性,在權重前面增長一個係數,能夠更快地降低收斂:

原來至關於以下的式子:

如今利用以前的保存的v來加速降低,對以前的v乘以一個m(動量,如0.9)。 如今算得的梯度爲-3,若是不使用動量,那麼最後更新值就是-3,若是使用動量而且以前的v假設是-9,那麼最後須要更新的值爲 -3 + 0.9 * (-9) = -11.1,這樣在當前梯度方向和上一次方面一致的時候就起到了快速更新的做用:

4. weigth_filler

xavier方式:
使用Uniform初始化,[-sqrt(3/n), sqrt(3/n)],n通常是number_in + number_out,保證參數初始化在一個尺度上,不要一個太大60,一個過小如0.2。

guassian:
標準分佈

3. train_val.prototxt, deploy.prototxt

solver.prototxt、train_val.prototxt用於訓練參數,deploy.prototxt用於前向傳播。

  1. train_val裏面詳細的定義了train, test的數據地址,deploy裏面則只簡單提供了維度。
  2. train_val裏面的權重初始化部分在deploy中能夠去掉,如weight_filler
  3. train_val裏面分train, test phase,train phase在輸入數據部分有,test phase在輸入數據、評估test準確率部分有,而在deploy不存在兩個階段。
  4. train_val裏面最後使用的類型是SoftmaxWithLoss,輸出的是loss,而deploy裏面最後應該是Softmax,輸出的是probs。

4. triplet loss

triplet loss是對於一個樣例x,分別選取一個同類樣例和異類樣例,組成一個三元組,使得存在一個邊界距離,使 其知足,最終的loss爲:

若是,則loss爲0,分類正確。
若是,則存在loss,分類出錯。

http://blog.csdn.net/tangwei2014/article/details/46788025

用triplet loss替換softmax loss能夠取得更好的效果:
https://www.zhihu.com/question/62486208/answer/199117070

5. embeding

使用one_hot來表示單詞,若是一共有8000個單詞,那就須要8000維。使用embeding方法能夠下降維度,如使用100維表示。

Embedding在數學上表示一個maping, f: X -> Y, 也就是一個function,其中該函數是injective(就是咱們所說的單射函數,每一個Y只有惟一的X對應,反之亦然)和structure-preserving (結構保存,好比在X所屬的空間上X1 < X2,那麼映射後在Y所屬空間上同理 Y1 < Y2)。

那麼對於word embedding,就是將單詞word映射到另一個空間,其中這個映射具備injective和structure-preserving的特色。

通俗的翻譯能夠認爲是單詞嵌入,就是把X所屬空間的單詞映射爲到Y空間的多維向量,那麼該多維向量至關於嵌入到Y所屬空間中,一個蘿蔔一個坑。word embedding,就是找到一個映射或者函數,生成在一個新的空間上的表達,該表達就是word representation。

推廣開來,還有image embedding, video embedding, 都是一種將源數據映射到另一個空間

6. 歸一化(Normalization)、標準化(Standardization)、正則化(Regularization)

歸一化:

縮放到(0, 1):

標準化:

用的最多的是 z-score標準化:

正則化:
能夠用在目標函數後面約束模型複雜度,也能夠進行數據處理, 能儘量的削弱「強勢」特徵,將一些數值較小可是比較有特色的特徵「凸顯」出來。。

將每一個樣本縮放到單位範數(每一個樣本的範數爲1),若是後面要使用如二次型(點積)或者其餘核函數方法計算兩個樣本之間的類似性,這個方法會頗有用。
對每一個樣本計算其p-範數, 每一個元素再除以p範數。

l2 正則化:

http://blog.csdn.net/power0405hf/article/details/53456162

7. 空洞卷積

又叫dilate_conv, atrous_conv。

卷積會使圖片的尺寸變小,損失信息,但另外一方面咱們又但願能夠得到更大的感覺野,如何在圖片減少較少的狀況獲取更多的感覺野?

如圖中所示,只計算紅點的卷積,其他綠色區域權重都爲0,(a)爲傳統的卷積,(b)(c)是空洞卷積,一樣是3x3的卷積, (b)、(c)擁有更大的感覺野。

dilate conv

dilate conv

https://www.zhihu.com/question/54149221/answer/192025860

Tensorflow中經過atrous_conv2d進行空洞卷積,原型以下:

tf.nn.atrous_conv2d(value,filters,rate,padding,name=None)
value: [batch_size, h, w, input_channel] 輸入圖片
filters: [filter_width, filter_width, input_channel, out_channel] 卷積核
rate: 控制空洞,若是=1, 正常卷積;若是=2,有1個空洞的卷積。

http://blog.csdn.net/mao_xiao_feng/article/details/78003730

10. 逆卷積(deconv)

Deconvolutional Network作圖片的unsupervised feature learning,ZF-Net論文中的卷積網絡可視化,FCN網絡中的upsampling,GAN中的Generative圖片生成。

其實是尋找一個逆矩陣,使2x2的大小能夠變換成4x4的大小,這個變換就像是4x4大小的圖像用3x3卷積核卷積成2x2的逆變換,因此就叫deconv。

https://www.zhihu.com/question/43609045/answer/132235276

11. hard negative mining

在作目標檢測時,會生成正負樣本,因爲負樣本是在非ground truth ROI處隨機crop獲得的,因此生成的負樣本不少,會形成樣本不均衡。爲了解決這個問題,把這些生成的負樣本輸入到網絡中,把分類錯的樣本取出來作爲最後的負樣本。

12. 模型壓縮

Network in Network
MobileNet
SqueezeNet
ShuffleNet

Network in Network:
https://arxiv.org/pdf/1312.4400.pdf
1x1 conv + avg pooling

SqueezeNet:
firemodule: 1x1 squeeze, 1x1 + 3x3 expand
paper: http://arxiv.org/abs/1602.07360
code: https://github.com/DeepScale/SqueezeNet

MobileNet:
https://arxiv.org/pdf/1704.04861.pdf
1x1 element-wise conv + 3x3 depth-wise conv

MobileNet: https://arxiv.org/pdf/1704.04861.pdf
原來的卷積權重參數個數爲KxKxCxF,如圖(a)。
如今將這個卷積解偶成兩步:
第一步是隻在一個通道上進行KxK卷積,而後逐層進行,如圖(b)。
第二步是在通道間進行1x1卷積,如圖(c)。
使用這種方法,參數個數變爲KxKxC + CxF。

!MobileNet.png!

若是K=3, C=128, F=256, 則兩種方法的參數個數分別爲3x3x128x256, 3x3x128+128x256,能夠減小9倍左右。

ShuffleNet:
shuffle channel

deep compresion:
https://arxiv.org/pdf/1510.00149v5.pdf

3、優秀網站

  1. 深度學習Roadmap
  2. TensorFlow 中文指南
  3. Deep Learning 中文版
  4. 零基礎入門深度學習
  5. CNN入門

Ref

https://www.jianshu.com/p/96791a306ea5
http://blog.csdn.net/QcloudCommunity/article/details/77719498

相關文章
相關標籤/搜索