接下来定义神经网络模型架构。
在实际的研发工作中,模型架构研究是主要工作。当你刚刚开始时,可以从学术论文中复制经过验证的架构,或者使用现有的示例,Keras中的示例网址。
首先声明一个Sequential模型格式:
model = Sequential()
接下来,声明输入层:
model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=input_shape))
input_shape
参数应为1个样本的形状。在本例中,与每个数字图像的(深度、宽度、高度)对应的是相同的(1,28,28)。
前3个参数分别对应于要使用的卷积滤波器的数量、每个卷积核中的行数和列数。
注意: 步骤大小默认为(1,1),可以使用“subsample”参数进行调优。
我们可以通过打印当前模型输出的形状来确认:
print (model.output_shape) # (None, 32, 26, 26)
接下来,可以简单地在模型中添加更多层,就像搭积木一样:
model.add(Convolution2D(32, 3, 3, activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25))
这里,我们不会过多讨论理论,如需进一步了解,可参考卷积神经网络。
MaxPooling2D层是池化层,进一步降低数据量提取特征,Dropout层的作用是防止过拟合。
到目前为止,对于模型参数,已经添加了2个卷积层。为完成CNN模型架构,还需添加一个全连接层和输出层:
model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax'))
对于全连接层/稠密层,第一个参数是该层的输出大小。Keras自动处理层之间的连接。
注意,最后一层的输出大小为10,对应于0~9的10个数字。
还要注意,在将卷积层的权值传递到全连接层之前,必须将卷积层的权值压平(使其为一维)。
下面是整个模型架构的定义过程:
model = Sequential() model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=input_shape)) model.add(Convolution2D(32, 3, 3, activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax'))
下面需要做的就是定义损失函数和优化器,然后就可以开始训练模型。
本文来自博客园,作者:大码王,转载请注明原文链接:https://www.cnblogs.com/huanghanyu/