与一个隐含层的神经网络不同的体现只在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个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}
)
主要是因为在卷积与全连接对应时,都需要进行批量正则化,所以会再写函数包装,不然写在一起太拥护,不便阅读。
发表评论