背景:
由于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/