← 返回卷宗
數據預測

研究CNTK(三):MNIST識別之02、03、04

CNTKDeep Learning神經網絡

與一個隱含層的神經網絡不同的體現只在MODEL這裡,它是這樣定義的:

 在01中定義是:

 model(x) = {
 s1 = x * featScale
 h1 = DenseLayer {200, activation=ReLU} (s1)
 z = LinearLayer {labelDim} (h1)
 }

 在02中的定義要配合圖比較直觀:

深度神經網絡卷積層

 model = Sequential (

 #歸一化
 Scale {featScale} :

 #創建卷積層,函數使用RELU,對圖像進行5:5的卷積,這就濾波器,這裡使用16個濾波器,因為不補零,所以是16個24x24的sudo-image
 ConvolutionalLayer {16, (5:5), pad = true} : ReLU :

 #進行最大池化,得到feature map,將會是16個12x12的矩陣
 MaxPoolingLayer {(2:2), stride=(2:2)} :

 //製作一個有64個神經元的隱藏層,激活仍然用RELU
 DenseLayer {64} : ReLU :

 //線性對應層進行輸出
 LinearLayer {labelDim}
 )

 

 02中用的主要是:來進行連接,01實際上也可以改寫為:

 model = Sequential (
 Scale {featScale} :
 DenseLayer {200} : ReLU :
 LinearLayer {labelDim}
 )

 冒號進行連接代表上一個的結果直接傳給下一個作為參數,即相當於f(x)中的x。

 ConvolutionalLayer函數定義:ConvolutionalLayer(數量,區塊定義,是否PAD,激活函數)

 到了03,就更簡單了,模型中主要是在池化後連接一個Dropout。

 model = Sequential (
 Scale {featScale} :
 ConvolutionalLayer {16, (5:5), pad = true} : ReLU :
 MaxPoolingLayer {(2:2), stride=(2:2)} : Dropout :
 DenseLayer {64} : ReLU :
 LinearLayer {labelDim}
 )

 到了04,則變化也不大,主要是加BatchNormalizationLayer

 # define a custom layer with 5x5 convolution, batch norm, relu and 2x2 max pooling
 ConvBnReluPoolLayer {outChannels, filterShape} = Sequential (
 ConvolutionalLayer {outChannels, filterShape, pad=true, bias=false} :
 BatchNormalizationLayer { spatialRank = 2} :
 ReLU :
 MaxPoolingLayer {(2:2), stride = (2:2)}
 )

 DenseBnReluLayer {outDim} = Sequential (
 LinearLayer {outDim} :   
 BatchNormalizationLayer {spatialRank = 1} : ReLU
 )
 
 model = Sequential (
 Scale {featScale} :
 ConvBnReluPoolLayer {16, (5:5)} :
 DenseBnReluLayer {64} :
 LinearLayer {labelDim}
 )

 主要是因為在卷積與全連接對應時,都需要進行批量正則化,所以會再寫函數包裝,不然寫在一起太擁護,不便閱讀。

本文由 三符道長 撰於 2016年10月27日。轉載請註明出處。