# Convolution Neural Network (CNN)
###### tags: `python` `Deep Learning`
---
>
>* **本文內容為“Tibame提升AI實作能力必備,深度學習TensorFlow基礎與應用”為主,版權為陳少君所有,本文僅做筆記用途,非商業用途**
>
>* **本篇圖片部分出自“Tibame提升AI實作能力必備,深度學習TensorFlow基礎與應用”課程內容講義**
>
---
# :memo: Introduction
## What is the difference between DNN and CNN?
**優點1.**
同樣處理輸入32X32X3 image,輸出28X28X64 image
DNN:因為要Flatten,所以運算需要(32X32X3)X(28X28X64),約等於154million
CNN:經過Kernal(3X5X5X64)=4800
節省了32000次計算
其中,
32X32X3(WXHX(RGB))
28X28X64(WXHX輸出channel)
3X5X5X64((RGB)XweightXweightX輸出channel)

**優點2.**
Convolution可以解決平移不變性
結論:
因為圖片像素周圍皆有關聯性,DNN Flatten後做Fully connection(FC)會多做出一些無謂的特徵相關,因此CNN會比傳統DNN還要快上許多
# Convolution Layer

Ref:[卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼](https://chih-sheng-huang821.medium.com/卷積神經網路-convolutional-neural-network-cnn-1-1卷積計算在做什麼-7d7ebfe34b8)
## Kernal
kernel也可以稱作filter,類似用濾鏡的方式來把特稱取出

## Stride
Stride為步長,即為方框在滑動時一次所需走之步數,常見為1
## Padding
由於經過濾鏡後輸出層會縮小原尺寸,解決此問題之方法為Padding,在輸入尺寸周圍加0,此方法即為圖片邊緣模糊化

## Dimension Reduction

Ref:[卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼](https://chih-sheng-huang821.medium.com/卷積神經網路-convolutional-neural-network-cnn-1-1卷積計算在做什麼-7d7ebfe34b8)
# Pooling Layer
[What is the benefit of using average pooling rather than max pooling?](https://www.quora.com/What-is-the-benefit-of-using-average-pooling-rather-than-max-pooling)
## Max pooling & Average pooling
通常都用Max pooling
# Fully Connected Layer(FC)
由於前段用卷積層或池化層減少其特徵運算,後段可以用FC來做特徵運算提高準度
# AlexNet
5個卷基層+3個全連接層
採用ReLU激活函數
# VGG
利用3X3 kernal代替AlexNet較大kernal
# GoogleNet
設計了一個叫Inception的模塊
最後卷基層使用Gobal Average Pooling替換全連接層
# ResNet
殘差網路
# CNN應用
## 單物件分類及定位
CNN有自動學習階層特徵(Hierarchical Features)
CNN產生了很多延伸,像是R-CNN, Fast R-CNN, Faster R-CNN以及即時Yolo(You Only Look Once)等技術
## 人臉辨識
找到人臉影像數據庫在Tensorflow中建置
# R-CNN(Regions with CNN)
1. 產生約2000個可能的區域(Region Proposals)
2. 將訓練好的CNN模型結果儲存起來
3. 用SVM(Support Vector Machine)分類器來區分是否為物體或背景
4. 經由Linear Regression來校正bounding box位置
R-CNN缺點:
1. 速度不夠快
2. 不容易作訓練
**Fast R-CNN**
使用ROIPooling,只用一次CNN並且為單一網路,較快也較易訓練
**Faster R-CNN**
直接從CNN的feature maps選出region proposals
# Yolo
只需要對圖面做一次CNN便能判斷裡面物體類別跟位置
原理:將一張圖片切割成SXS個方格,每個方格以自己為中心去判斷B個bounding boxes包含物體的confidence score跟種類
confidence score = Pr(Object)\*IOU(ground truth)
IOU:Intersection over Union(兩個bounding box交集)
當box有包含物件且IOU交集面積越大,分數就越高
最後取最高分數之bounding box


[pretrained YOLO object detection on Github](https://github.com/Garima13a/YOLO-Object-Detection)
# Word Embedding
文字轉向量來解決深度學習指認數字不認文字串之問題
原理:將期望意義相近的字或詞有比較短的幾何距離,即為將某篇文章之每個特定單獨字都設定成000001,000010的樣子,而此方法也稱為One Hot Encoding
Ex:King & Queen, Man & Woman, France & Germany
## word2vec
由google在2013推出的NLP工具
原理:一個當前詞預測前後詞(CBOW)或前後詞預測當前詞(SKIP-GRAM),因此相同部位的詞會相關
傳統DNN模型:CBOW(Continuous Bag-of-Words), Skip-Gram
但是此模型詞彙高達百萬種,因此才產生出Word2Vec來解決此問題
Word2Vec有四種模型:
- Hierarchical Softmax CBOW
- Hierarchical Softmax Skip-Gram
- Negative Sampling CBOW
- Negative Sampling Skip-Gram
## Gensim
優點:
- Memory independence
- Memory sharing
- 多種向量空間算法之高效實現
- 支持多種數據結構
- 基於語義表示文檔相似度來查詢
Demo:[從汽車規格資料中挑出類似的機種(Make + Model)](https://github.com/zhlli1/Genism-word2vec)
## Skip-Gram
Bag of words是最早嘗試把文字轉換成向量,以便建模和預測分析的方式
缺點:
1. 只關注詞出現的次數(Count),並沒有考慮其順序(Order)或上下文(Context)
2. Bag of Words是稀疏(Sparse)的,在真實應用大樣本的情況下,詞庫的數量級可能達到10000+,極為浪費資源。
skip-gram 模型的目標是由目標字找到上下文
Ex:“the quick brown fox jumps over the lazy dog”
brown去猜\[quick,fox], quick去猜\[the, brown]
步驟:
Step1. Build the corpus vocabulary
Step2. Build a skip-gram\[(target, context), relevancy] generator
Step3. Build the skip-gram model architecture
Step4. Train the Model
Step5. Get Word Embeddings
Demo:[利用Skip-Gram比較兩句子的距離](https://www.kaggle.com/kesarianubhav/skipgram-word2vec)
## CBOW
CBOW(Continous Bag of Words)是一個連續不斷的詞袋,裏頭有上下文以集目標詞,嘗試從上下文去猜測目標詞的機率,取決於窗口的寬度(context window width),上下文可能是一個字或一群字
Ex:“the quick brown fox jumps over the lazy dog”
\[quick,fox]去猜brown, \[the, brown]去猜quick
Skip-gram像是多個老師(周圍詞)在教一個學生(中心詞),中心詞經過嚴格訓練後向量結果會較為精準,但是時間會花比較久
CBOW像是多個學生(周圍詞)從一個老師(中心詞)學習知識,周圍詞學到多少要看是否能再從下一次同一個中心詞學習,學習速度快,但效果差
因此Skip-gram進行預測時間會多餘CBOW,但是Skip-gram會準確優於CBOW
Demo:[Cbow.ipynb](https://github.com/nzw0301/kerasexamples/blob/master/CBoW.ipynb)