Python机器学习,七十六Keras 模型架构

接下来定义神经网络模型架构。

在实际的研发工作中,模型架构研究是主要工作。当你刚刚开始时,可以从学术论文中复制经过验证的架构,或者使用现有的示例,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'))

下面需要做的就是定义损失函数和优化器,然后就可以开始训练模型。