Computer vision 为什么可以';我的CNN不知道吗?

Computer vision 为什么可以';我的CNN不知道吗?,computer-vision,neural-network,tensorflow,deep-learning,Computer Vision,Neural Network,Tensorflow,Deep Learning,我对深度学习还不熟悉。我刚刚用Tensorflow实现了一个CNN,并在CIFAR-10(一个对象识别基准,图像分为10个不同的类)上进行了尝试 在训练过程中,训练损失在开始时下降得非常快(从100000下降到3),但随后一直停留在2.30左右(约为log(1/10))。由于我使用交叉熵作为损失函数,损失2.30意味着我的模型的准确率在10%左右——与随机猜测完全相同(我检查了模型的实际输出,几乎每个类都在10%左右) 我试着增大模型的尺寸,以确定这是否是因为我的模型不够“坚固”而无法过度贴合。

我对深度学习还不熟悉。我刚刚用Tensorflow实现了一个CNN,并在CIFAR-10(一个对象识别基准,图像分为10个不同的类)上进行了尝试

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

我试着增大模型的尺寸,以确定这是否是因为我的模型不够“坚固”而无法过度贴合。但事实证明,无论我如何增加或减少模型大小,训练损失总是在2.30左右停止减少

我很有信心我正确地实现了它,因为我的模型用于更简单的任务,比如MNIST(手写数字识别)。所以我真的很想知道问题出在哪里。谢谢。

conv1:带relu的卷积层

池1:最大池层

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()
编辑:

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、poolg1、conv2、poolg2、fc1、fc2、softmax)和预处理,如增白等。为了简单起见,我认为这可能不会影响我的性能,从86%到10%


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

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

事实上,您需要为人们提供实际的代码,以便提供更具体的建议,但基于您描述的模型,我至少建议您考虑一些可以解决此问题的其他模型。例如,Tensorflow配备了一个可在CIFAR-10上实现约86%精度的模型,但该模型更为复杂。即使有额外的卷积层和完全连接层、标准化和输入预处理(白化、数据增强等)以及调优的超参数,仍然需要在强大的GPU上进行几个小时的训练才能获得良好的结果


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

您检查过标签两次了吗,可能在洗牌数据时出错了?MNIST的功能更简单,因此一个conv层就足够了,要开始学习像CIFAR-10这样的真实图像数据集,您需要至少添加另一个conv层。i、 e conv2和pool2。遵循这个例子:是的,但我也尝试了两个conv层和两个pooling层。仍然停留在2.3左右,您是否对更复杂的模型进行了很多超参数优化?如果您发布代码的最低版本,可能会有所帮助。我几乎看不懂你的图表中的张量形状,但它看起来像是[?,32,32,3]=>CONV1/POOL1=>[?,16,16,128]=>CONV2/POOL2=>[?,8,8,64]。如果我没看错的话,那不太可能奏效。网络的“宽度”在第一次卷积后非常宽,然后急剧缩小,第二次卷积丢弃了许多特征。[?,32,32,3]=>[?,16,16,64]=>[?,8,8,128]会更好。谢谢你发布代码。我不确定它到底是做什么的——看起来它使用了一些非标准函数(可能是您创建的基础设施?),我建议使用5x5内核。(3x3内核可以工作- VGGNet是一个很好的例子,但当然这是一个更深层次的网络体系结构)。根据我以前的评论,考虑避免网络宽度的急剧变化。谢谢你的回答,但是正如我已经提到的。我试图通过添加更多层来增加模型的复杂性,并且几乎尝试了教程中的层,除了我没有标准层(conv1、poolg1、conv2、poolg2、fc1、fc2、softmax)和预处理,如增白等。为了简单起见,我认为这可能不会影响我的性能,从86%到10%,可能吗?你们用更复杂的模型做了什么超参数优化?即使是神经网络结构上的细微差异,也需要大量的超参数优化,以获得比随机精度更好的精度。嗨,@Aenimated,我已经发布了我的代码。顺便说一句,它与开始时的版本略有不同,因为我使它更复杂,但仍然没有多大进展。