背景:

由于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

然后,我在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

问题:

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

感谢你们的时间和帮助。

最佳答案

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

  • 这些体系结构在很多方面有所不同,而不仅仅是堆叠转换网络。
  • 堆叠卷积网络通常可以减少处理过程中丢失的信息。参见例如“所有卷积”架构。
  • 关于machine-learning - 在CNN中删除之前堆叠多个Conv2D层背后的直觉,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46515248/

    10-12 23:09