为什么要完全卷积网络平台然后学习?

时间:2019-01-28 11:11:34

标签: machine-learning neural-network deep-learning conv-neural-network loss-function

为什么先完全卷积网络然后学习?

我训练了一个完整的卷积网络来对手写汉字进行分类。我正在使用的开发数据集有250个类,每个类中有200-300个样本。

我发现无论我如何调整模型,到目前为止我尝试过的模型都具有相似的行为,首先它们都处于平稳状态,然后精度开始上升,而损失减少,因为在以下屏幕截图中显示:

FCN Plateau

我想了解更多有关此行为的原因。

非常感谢!

修改

对不起,之前没有提供更多详细信息。

到目前为止,我的最佳网络是使用LR为0.1的Adadelta优化器。我的体重是使用xavier初始化进行初始化的。

Input(shape=(30, 30, 1))
Lambda(
    lambda image: tf.image.resize_images(
        image, size=(resize_size, resize_size),
        method=tf.image.ResizeMethod.BILINEAR
    )
)

Conv2D(filters=96, kernel_size=(5, 5), strides=(1, 1), padding="same", "relu")
Conv2D(filters=96, kernel_size=(1, 1), strides=(1, 1), padding="same", "relu")
MaxPooling2D(pool_size=(3, 3), strides=2)

Conv2D(filters=192, kernel_size=(5, 5), strides=(2, 2), padding="same", "relu")
Conv2D(filters=192, kernel_size=(1, 1), strides=(1, 1), padding="same", "relu")
MaxPooling2D(pool_size=(3, 3), strides=2)

Conv2D(filters=192, kernel_size=(3, 3), "same", "relu")
Conv2D(filters=192, kernel_size=(1, 1), "same", "relu")
Conv2D(filters=10, kernel_size=(1, 1), "same", "relu")
AveragePooling2D(pool_size=(3, 3))
Flatten()
Dense(250, activation="softmax")

model = Model(inp, x)

model.compile(
    loss=categorical_crossentropy,
    optimizer=Adadelta(lr=0.1),
    metrics=["accuracy"],
)

关于输入数据,它们都是我手写的汉字,大小为30x30x1(在输入层之后存在Lambda层是因为我遵循原始{{ 3}}纸张,并且它们使用32x32输入尺寸),如下所示:

FCN paper

这就是上面的损耗和准确性图表的产生方式。

希望这可以提供更好的直觉。谢谢。

1 个答案:

答案 0 :(得分:2)

我们无法具体回答,因为您忽略了充分识别网络和输入的信息,更不用说培训方法了。为了全面跟踪高级培训特征,我们需要通过所讨论的迭代对内核进行一些详细的可视化显示。

通常,这仅仅是因为高度复杂的模型通常需要几次迭代才能变得比随机结果更好。我们从随机权重和内核开始。在前几次迭代中,该模型必须克服混乱,在早期内核中建立一些有用的模式,并找到与足够多的输出类别相关的权重,以使准确性达到0.4%以上并具有统计学意义。

问题的一部分在于,在最初的几次迭代中,该模型还偶然发现了对混乱有用的模式,但实际上对长期学习有害。例如,它可能会为黑点构建一个图案,并正确猜测这与哺乳动物的眼睛和车轮有关。很快,飞机和Airedale在结构上相关联的概括,被证明是错误的假设。它必须打破这些类别之间的二级关联,并找到其他东西。

这种学习会使准确性降低的时间长于您的想象。该模型花费了最初的几次迭代,以得出关于分类的数百个结论,这些结论都与一个或两个正确的猜测相关。然后,它必须学习足够的知识才能将有效的和无效的分开。 是模型可以保留前进的地方。