通常卷积神经网络的层数是不断升高的,如经典的resnet和vgg网络。
vgg的网络结构:
conv_layers = [ # 5 units of conv + max pooling
# unit 1
layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
# unit 2
layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
# unit 3
layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
# unit 4
layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
# unit 5
layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same')
]
理解这个问题首先要理解filter size的作用,就是layers的作用。
由于图像是像素形成的,因此第一层一般是提取像素点,而这些像素点一般是noisy的。因此卷积层的作用就是在这些noisy背景中提取图像特征。每一层layer都提取图像的一些特征,在浅层时,我们提取的大部分是浅层次的特征,如图像的边缘,角,点,线等。在下一卷积层,我们将这些浅层次特征再次组合形成较大的特征,如把边缘组合成正方形,圆形等。
当卷积层继续增加时,这些初步特征将组合成更高层次的pattern,如车轮,车窗,车灯等。所以卷积层的filter设置越来越高,将高层的特征传给全连接层用来训练模型。