在CNN中删除之前堆叠多个Conv2D层背后的直觉

Nah*_*hua 4 machine-learning deep-learning keras tensorflow

背景

由于Keras运行在TensorFlow之上,因此对TensorFlow进行了标记,这更是一个普遍的深度学习问题。

我一直在研究Kaggle Digit Recognizer问题,并使用Keras训练了该任务的CNN模型。下面的模型具有我用于本次比赛的原始CNN结构,并且效果还不错。

def build_model1():
    model = models.Sequential()

    model.add(layers.Conv2D(32, (3, 3), padding="Same" activation="relu", input_shape=[28, 28, 1]))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Dropout(0.25))

    model.add(layers.Conv2D(64, (3, 3), padding="Same", activation="relu"))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Dropout(0.25))

    model.add(layers.Conv2D(64, (3, 3), padding="Same", activation="relu"))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Dropout(0.25))

    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation="relu"))
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(10, activation="softmax"))

    return model
Run Code Online (Sandbox Code Playgroud)

然后,我在Kaggle上阅读了一些其他笔记本,并借用了另一个CNN结构(复制如下),该结构比上面的结构好得多,因为它具有更好的准确性,更低的错误率,并且在过度拟合训练数据之前花费了更多的时间。

def build_model2():
    model = models.Sequential()

    model.add(layers.Conv2D(32, (5, 5),padding ='Same', activation='relu', input_shape = (28, 28, 1)))
    model.add(layers.Conv2D(32, (5, 5),padding = 'Same', activation ='relu'))
    model.add(layers.MaxPool2D((2, 2)))
    model.add(layers.Dropout(0.25))

    model.add(layers.Conv2D(64,(3, 3),padding = 'Same', activation ='relu'))
    model.add(layers.Conv2D(64, (3, 3),padding = 'Same', activation ='relu'))
    model.add(layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
    model.add(layers.Dropout(0.25))

    model.add(layers.Flatten())
    model.add(layers.Dense(256, activation = "relu"))
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(10, activation = "softmax"))

    return model
Run Code Online (Sandbox Code Playgroud)

问题

第二CNN结构的更好性能背后是否有任何直觉或解释?是什么使堆栈2个Conv2D层比仅在最大合并和丢失之前仅使用1个Conv2D层更好?还是有其他因素有助于第二个模型的结果?

感谢你们的时间和帮助。

lej*_*lot 7

这两种方法之间的主要区别在于,后一种方法(2 conv)在表达非线性变换而不丢失信息时具有更大的灵活性。Maxpool从信号中删除信息,丢包迫使分布表示,因此两者都使传播信息变得更加困难。如果对于给定的问题,必须对原始数据应用高度非线性的转换,则堆叠多个conv(使用relu)将使其更易于学习,就是这样。另请注意,您正在将一个具有3个最大池的模型与一个只有2个模型的模型进行比较,因此,第二个模型可能会丢失较少的信息。另一件事是,它的末尾具有更大的完全连接位,而第一个很小(64个神经元+ 0.5丢失意味着您最多可以有效地激活32个神经元,这是一个很小的层!)。总结一下:

  1. 这些体系结构在很多方面都存在差异,而不仅仅是堆叠卷积网络。
  2. 堆叠卷积网络通常可以减少处理过程中丢失的信息。参见例如“所有卷积”架构。