深度学习4:卷积神经网kaggle猫狗分类(2)

代码实例分析

上接上一篇。

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

现在就开始构建我们的卷积网络了。卷积网络的结构是conv2D和maxpooling2D的堆叠,即为卷积层和池化层。
第一层是卷积层,它的卷积窗口是3×3的尺寸,步幅默认为1.(卷积的概念就不详细说明了)用relu来激活,32代表输出的深度,换句话说这是卷积计算的过滤器的数量,对于过滤器可以理解为每个过滤器都承接了图的一部分特征,32就代表了32个不同位置的特征。inputshape就表示图像的像素是150×150,3代表有3个颜色通道,因为图像是rgb,如果是黑白的,这个数字就是1.
第二层就是最大池化层了,它的运算是卷积运算,但和上一层的区别是,它的步幅是2,卷积窗口的尺寸是2×2,目的就是将特征图的规模减小。对于一个小的模型,数据的量太大会导致严重的过拟合,我们也不需要这么多的复杂信息。
后面到了flatten,即为展平。要想得到分类的效果,就要先把多维的张量展平为1维的,后面就是最熟悉的dense层,用relu和sigmoid最终输出分类的结果。

我们通过分析卷积网络的特点就会发现,卷积的核心在于通过小窗口不停地采集局部的信息,组成新的组合之后再循环这个步骤,使得学习的过程中对于局部的特点反应很好,特点的位置信息反而不重要了,这更加有利于学习抽象的图片;而dense层对全局的学习非常不适合用在图片上,因为图片不是一成不变的。

model.summary()

看一下网络的详情


Layer (type) Output Shape Param

conv2d_1 (Conv2D) (None, 148, 148, 32) 896


max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32) 0


conv2d_2 (Conv2D) (None, 72, 72, 64) 18496


max_pooling2d_2 (MaxPooling2 (None, 36, 36, 64) 0


conv2d_3 (Conv2D) (None, 34, 34, 128) 73856


max_pooling2d_3 (MaxPooling2 (None, 17, 17, 128) 0


conv2d_4 (Conv2D) (None, 15, 15, 128) 147584


max_pooling2d_4 (MaxPooling2 (None, 7, 7, 128) 0


flatten_1 (Flatten) (None, 6272) 0


dense_1 (Dense) (None, 512) 3211776


dense_2 (Dense) (None, 1) 513

Total params: 3,453,121
Trainable params: 3,453,121
Non-trainable params: 0
可以看到每次输出的特征图的维度都在变小,最后是7×7的尺寸,而深度不断增大,意味着网络提取的特点更加的多,图像辨别更加精确。

你可能感兴趣的:(深度学习)