研究CNTK(三):MNIST识别之02、03、04

与一个隐含层的神经网络不同的体现只在MODEL这里,它是这样定义的:

     在01中定义是:

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

    在02中的定义要配合图比较直观:

道家阴符派博客--研究CNTK(三):MNIST识别之02、03、04--CNTK

        model = Sequential (

            #归一化
            Scale {featScale} :

            #创建卷积层,函数使用RELU,对图像进行5:5的卷积,这就滤波器,这里使用16个滤波器,因为不补零,所以是16个24×24的sudo-image
            ConvolutionalLayer {16, (5:5), pad = true} : ReLU :

            #进行最大池化,得到feature map,将会是16个12×12的矩阵
            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 5×5 convolution, batch norm, relu and 2×2 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}
        )

        主要是因为在卷积与全连接对应时,都需要进行批量正则化,所以会再写函数包装,不然写在一起太拥护,不便阅读。

发表评论

电子邮件地址不会被公开。 必填项已用*标注