3.4 探索卷积网络
你可以使用model.summary
命令来检查模型。当你在我们一直使用的基于Fashion MNIST的卷积网络上运行这个命令时,会看到下面的结果:
让我们首先查看Output Shape(输出形状)这一列来理解这里发生了什么。第一层会有28×28的图像,并在它们之上使用64个滤波器。但是由于滤波器是3×3的,图像周围1像素宽度的边框会丢失,将总的信息缩减为26×26像素。参考图3-6。如果我们把图像中的每像素看作一个框,那么第一个可以用的滤波器是从第二行和第二列开始。在图像的右边和下边会发生同样的事情。
图3-6:运行滤波器时会丢失像素
因此,当运行一个3×3的滤波器时,一个形状为A×B的图像的形状会变为(A-2)×(B-2)像素。类似地,一个5×5的滤波器会让图像变为(A-4)×(B-4),以此类推。因为我们使用的是28×28的图像和3×3的滤波器,因此输出是26×26。
在那之后池化层是2×2,因此图像的每个尺寸都会减半,于是它会变为13×13。下一个卷积层会把它进一步减少为11×11,然后下一个池化层会让图像变为5×5。
因此,当图像经过两个卷积层时,结果将会变成许多5×5的图像。有多少个呢?我们可以在Param #(参数)那一列找到。
每一个卷积是一个3×3的滤波器,再加上一个偏差。还记得之前的密集层,每一层是Y=mX+c,m是参数(权重)而c是偏差。这里也十分相似,不过这里的滤波器是3×3,因此有9个参数需要学习。已知我们定义了64个卷积,那么总共有640个参数(每个卷积有9个参数加一个偏差,因此总共有10个参数,并且那里有64个滤波器)。
MaxPooling
层不学习任何参数,它们只是减少图像的大小,因此那里没有参数需要学习,所以报告的是0。
下一个卷积层有64个滤波器,但是每一个都是与之前64个滤波器相乘,每一个滤波器包含9个参数。我们在每一个新的64个滤波器中都包含一个偏差,因此参数个数应该是(64×(64×9))+64,结果是网络需要学习36 928个参数。
如果你感到困惑,可以尝试改变第一层的卷积个数。例如,10。你会看到第二层的参数个数变为5824,也就是(64×(10×9)+64)。
当经过第二个卷积时,图像的大小是5×5,并且有64个这样的图像。如果我们把这些数字相乘,会得到1600个值,这些值将会被我们传入下一个包含128个神经元的密集层。每个神经元包含一个权重和一个偏差,并且我们有128个神经元,因此网络需要学习的参数个数为((5×5×64)×128)+128,也就是204 928个参数。
最终的密集层包含10个神经元,它接受前面128个神经元的输出,所以需要学习的参数是(128×10)+10,也就是1290个。
把这些数字全部加起来,总的参数个数为243 786。
训练一个神经网络需要学习这243 786个参数的最优集合,从而将输入图像匹配到它们的标签上。这是一个十分缓慢的过程,因为参数的数量变多了,但是我们可以从结果中看到,这也构建了一个更加准确的模型!
当然,使用这个数据集依然有个缺陷,那就是图像的大小是28×28,单色的,并且是居中的。接下来,我们会看一看使用卷积来探索一个更复杂的数据集(包含马和人的照片),并且我们会试图判别一个图像是否包含其中一个类型。在这种情况下,主体对象并不一定会像Fashion MNIST那样居于图像中心,因此我们需要依赖卷积来识别出突出的特征。