为什么我的 CNN 无法学习?

Why can't my CNN learn?

我是深度学习新手。我刚刚用 Tensorflow 实现了一个 CNN,并在 CIFAR-10(一个对象识别基准,其中图像在 10 个不同的 classes 中)进行了尝试。

在训练过程中,training loss一开始下降得非常快(从100000下降到3),但后来一直停留在2.30左右(大约是log (1/10))。由于我使用交叉熵作为损失函数,损失为 2.30 意味着我的模型准确率在 10% 左右 ---- 与随机猜测完全相同(我检查了模型的实际输出,实际上几乎都在 10% 左右每个 class)。

我尝试增加模型的大小,看看是不是因为我的模型不够"strong"过拟合。但事实证明,无论我如何增加或减少模型大小,训练损失总是会在 2.30 左右停止减少。

我非常有信心我正确地实现了它,因为我的模型适用于更简单的任务,例如 MNIST(手写数字识别)。所以我真的很想知道问题可能是什么。非常感谢。

conv1: 带relu的卷积层

pooling1:最大池化层

fc1:带relu的全连接层

输出:带softmax的全连接层

代码:

nn = NeuralNetwork(optimizer=Adam(0.001), log_dir='logs')
nn.add(Input('input', [32, 32, 3], ))
nn.add(Convolution2D(name='conv1', filter_height=3, filter_width=3, 
                     n_output_channels=256, activation_fn='relu'))
nn.add(Pooling2D('pooling1', mode='max', pool_shape=(3, 3), padding='SAME'))
nn.add(Convolution2D(name='conv2', filter_height=3, filter_width=3, 
                     n_output_channels=128, activation_fn='relu'))
nn.add(Pooling2D('pooling2', mode='max', pool_shape=(3, 3), padding='SAME'))
nn.add(FullyConnected('fc1', 384, activation_fn='relu',
                      weight_init=truncated_normal(), bias_init=constant(0.1)))
nn.add(FullyConnected('fc2', 192, activation_fn='relu', 
                      weight_init=truncated_normal(), bias_init=constant(0.1)))
nn.add(Output(loss_fn='sparse_softmax_cross_entropy', output_fn='softmax',
              name='output', target_shape=[], target_dtype=tf.int64, 
              output_shape=10))
nn.build()

编辑:

正如我所提到的。我试图通过添加更多层来增加我的模型的复杂性并且几乎尝试了教程中的那个,除了我没有规范层(conv1,pooling1,conv2,pooling2,fc1,fc2,softmax)和预处理如美白等。为简单起见,我认为这可能不会像从 86% 到 10% 这样严重影响我的表现。

我认为可能有帮助的另一个线索是我发现层 fc1 的输出非常稀疏(几乎 99% 的元素是零)。由于我使用 ReLU 作为激活函数,这意味着 fc1 中的单元大部分都死了。我有什么可以用它做的吗?

您可能只是严重低估了在此任务上取得合理结果所需的体系结构。您描述的模型(input->conv1->pooling1->fc1->output)可能适用于 MNIST,但这并不意味着它可以在涉及真实彩色图像的图像分类任务中取得比随机结果更好的结果。

现实情况是,您需要为人们提供实际代码以提供更具体的建议,但根据您描述的模型,我至少会建议您查看一些可以解决此问题的其他模型.例如,Tensorflow 自带的 example CNN 可以在 CIFAR-10 上达到 ~86% 的准确率,但这个模型更复杂。即使有额外的卷积层和全连接层、归一化和输入预处理(白化、数据增强等)和调优超参数,仍然需要在强大的 GPU 上进行数小时的训练才能获得良好的结果。

总之,长话短说,我认为您应该查看示例模型以了解所需的架构类型。很容易低估在随机彩色图像中识别对象与黑白数字组相比要复杂得多。