trybeetle

take it slow!!

DeepLearning.ai course4振り返り


Posted on Aug. 26, 2018, 10:10 a.m.



DeepLearning.aiのコース(Convolutional Network)では、Convolution Networkについて学びます。


week 1

week 1では、Convolutional Networkは、ConvolutionとPoolingとFully Connectedのブロックから構成されます。


Convollution

Convolutionは下記の4ステップで構成されています。

  • Zero padding
  • Convolve window
  • Convolution forward
  • Convolution Backward

Zero paddingでは、Convolutionの実行前後でサイズを揃えたいときに使います。Zero paddingを使用しない場合、HeightとWidthのサイズが縮小されます。
Convolution後のサイズは下記の様に求めることができます。

$$ n_H = \lfloor \frac{n_{H_{prev}} - f + 2 \times pad}{stride} \rfloor +1 $$ $$ n_W = \lfloor \frac{n_{W_{prev}} - f + 2 \times pad}{stride} \rfloor +1 $$ $$ n_C = \text{number of filters used in the convolution}$$


Convolve windowでは、window(filter)を作成し、slidingしていきます。よくあるfilterサイズとして、(3 x 3 x n_C_prev)の様な形があります。filterのチャンネルサイズは、inputのchannelサイズと揃えてあげる必要があります。

代表的なfilterとして、verticalやhorizontalを識別するための、filterがあります。

CNNでは、Filterはparameterとするため、Back propで求めることになります。例えば、3x3のフィルターの場合は、w1,w2,w3.....w9の9つのパラメータを求めることになります。filterの初期値は、Xavier方式などで初期化します。


Backward propagationでは、dA dW, db を求める際に下記の様に計算します。

$$ dA += \sum _{h=0} ^{n_H} \sum_{w=0} ^{n_W} W_c \times dZ_{hw} $$ $$ dW_c += \sum _{h=0} ^{n_H} \sum_{w=0} ^ {n_W} a_{slice} \times dZ_{hw} $$ $$ db = \sum_h \sum_w dZ_{hw} $$


Pooling

主なPoolingとして、Max-poolingとAverage-poolingがあります。その内、Max-Poolingが特徴をより打ち消すことなく、縮小できるので良く使用されます。

Poolingは下記の4ステップで構成されています。

  • Pooling forward
  • Create mask
  • Distribute value
  • Pooling backward

Poolingでは、convolutionと同様にwindowをslidingさせながら適用範囲を移動させていきます。ただし、基本的にPaddingは使用しないため、Pooling後のサイズは下記の様に求めることができます。

$$ n_H = \lfloor \frac{n_{H_{prev}} - f}{stride} \rfloor +1 $$ $$ n_W = \lfloor \frac{n_{W_{prev}} - f}{stride} \rfloor +1 $$ $$ n_C = n_{C_{prev}}$$


Max-poolingの場合には、filterで囲まれた中で最も高い値を取り出してきます。
一方で、Average-poolingの場合には、Backward propをする際に、下記の様なMaskを作成します。


Fully connected(FC)では、多次元のデータをvectorに戻し、softmax等で推定値を求めます。(7x7x100 -> 4900x1)




week 2

week2では、いくつかのNueral Networkの種類について学びます。

Classicなものでは、LeNet-5、AlexNet、VGG-16等があります。<

より新しいNeural Networkとして、ResNetやInception Networkがあります。これらの手法では、大規模ネットワークで生じやすいVanishing gradientの問題を防ぐために工夫がなされています。


ResNet

ResNetでは、Skip connectionという手法を用いて、次のResBlock(3 layer分)のInputに、加算することで、Vanishing問題を防ぎます。

convolutionでサイズに変更が無い場合は、上記の様に、そのまま加算します。
一方で、Zero paddingをせずにサイズが縮小した場合には、Skip connectionで加算する部分に対してもConvolutionを実施して、サイズを揃えてあげます。


Inception Network

Inception Networkは、一つのlayerで複数の種類のConvolution/Poolingを行い、その結果をスタックするイメージです。
使用するConvolution windowとしては、1x1, 3x3, 5x5, max-poolingを使用します。

また、3x3, 5x5, max-poolingのConvolutionを実行する前に、あらかじめ1x1のConvolutionを実行することで、Channel数を減らします。

上記の処理をInception Blockごとに繰り返します。




week 3

week3では、Object Detectionについて学びます。

Localization

Object Detectionでは、対象物をボックスで囲う必要があるため、ボックスの位置も推定値に含む必要があります。

  • P_C: Objectが在る(1)か否(0)か
  • B_X: ボックスの中心点のX座標
  • B_Y: ボックスの中心点のY座標
  • B_H: ボックスの縦の長さ
  • B_W: ボックスの横の長さ
  • C_1: ObjectがC_1であるとき1(そうでなければ0)
  • C_2: ObjectがC_2であるとき1(そうでなければ0)
  • C_3: ObjectがC_3であるとき1(そうでなければ0)

loss functionは、square errで大丈夫です。


Landmark Detection

Landmark detectionでは、ボックスを求めるのではなく、点を求めます。

推定値に必要な情報は、各LandmarkのX座標とY座標を求める必要があります。
そのため、N個のLandmarkを求める場合は、2N個のOutput unitが必要になります。


(Sliding window) Object Detection

Sliding windowにより、少しずつwindowをずらしながら、Objectが無いか確認する方法があります。


YOLO algolithm

YOLOでは、imageをセル単位に分割し、求めます。

各セル毎に推定値を求めます。また、複数のAnchor boxを設定し、様々な物体の大きさに対応させます。

そのため、イメージ内に、多数のAnchor boxが発生します。その中で、適切なAnchor boxだけを残すために、下記の2点でフィルタリング(No max suppression)を掛けます。

  • Objectがある可能性が閾値よりも高いものを残す(P_C > score_threshhold)
  • IOU(Intersection over Union)が閾値よりもが閾値よりも高いものは外す(重複している可能性が高い)



week 4

week4では、Face recognitionと、Neural style transferについて学びます。

Face recognition

face recognitionでは、one shot learningの問題が発生します。one shot learningでは、1枚の写真により判定を行わなければいけません。

Triplet lossを用いてデータのトレーニングを行います。Ancharとなる写真A、Positiveとなる写真P、Negativeとなる写真Nがあった場合、triplet lossは下記の様に求めます。

$$\mathcal{J} = \sum^{m}_{i=1} \large[ \small \mid \mid f(A^{(i)}) - f(P^{(i)}) \mid \mid_2^2 - \mid \mid f(A^{(i)}) - f(N^{(i)}) \mid \mid_2^2+ \alpha \large ] \small_+ $$ [z]+ は $max(z,0)を意図する

上記のcost functionが最小となるように、Gradient Descentを実行し、最適となるParameterを求めます。


Neural style transfer

Neural style transferでは、写真とスタイル画像を融合させて新たなイメージを生成する手法です。

普段と異なる点として、推定値が、パラメータではなく新たに生成する画像を直接求めることになります。

下記のCost functionを最小にすることを目的とします。

$$J(G) = \alpha J_{content}(C,G) + \beta J_{style}(S,G)$$ $$J_{content}(C,G) = \frac{1}{4 \times n_H \times n_W \times n_C}\sum _{ \text{all entries}} (a^{(C)} - a^{(G)})^2 $$ $$J_{style}^{[l]}(S,G) = \frac{1}{4 \times {n_C}^2 \times (n_H \times n_W)^2} \sum _{i=1}^{n_C}\sum_{j=1}^{n_C}(G^{(S)}_{ij} - G^{(G)}_{ij})^2 $$ $$J_{style}(S,G) = \sum_{l} \lambda^{[l]} J^{[l]}_{style}(S,G)$$ Styleでは、1つのレイヤーから求めるよりも複数レイヤーを掛け合わせて求めることでよりスタイルの特徴を掴んだ結果が得られます。

上記をGradient Descentで繰り返し求めることで、ContentとGeneratedImageが近づき、StyleとGeneratedImageの特徴がより類似することとなり、より写真とStyleが融合されたイメージになります。


Category:ML
Tag: ML python
Aug. 26, 2018, 10:10 a.m.

Comments