研究CNTK(三):MNIST識別之02、03、04
與一個隱含層的神經網絡不同的體現只在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}
)
主要是因為在卷積與全連接對應時,都需要進行批量正則化,所以會再寫函數包裝,不然寫在一起太擁護,不便閱讀。
