Tensorflow CNN实施的准确性较差

时间:2018-01-05 22:01:26

标签: python tensorflow machine-learning neural-network conv-neural-network

我试图在Tensorflow中实现一个5层深度卷积神经网络,其中包含3个卷积层,然后是2个完全连接的层。我目前的实施情况如下。

APP#1

由于某些未知原因,该模型似乎没有将其准确度提高到10%以上。我一直在撞墙,试图找出原因。我使用softmax损失成本函数(如here所述)和动量优化器。使用的数据集是GTSRB dataset

虽然我可以添加各种深度学习功能(例如自适应学习率等)以提高准确性,但我怀疑为什么基本的CNN模型表现如此糟糕。

有什么明显可以解释为什么它没有像预期的那样学习?或者,有什么我可以尝试帮助诊断问题?

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:1)

  

我正在使用softmax损失成本函数和动量优化器。

我相信至少有一个问题是失败。这个表达式不是交叉熵损失:

# WRONG!
tf.reduce_mean(tf.negative(tf.log(tf.reduce_sum(tf.multiply(y_conv,y_),1)))

this question中查看正确的公式。无论如何,你应该只使用tf.nn.softmax_cross_entropy_with_logits(并从y_conv中删除softmax,因为损失函数本身应用了softmax)。

PS。 CNN架构看起来不错,应该使用正确的超参数达到60%-70%。

答案 1 :(得分:1)

有几点值得帮助:

  1. 如另一个答案所述,损失函数不正确;使用tf.nn.softmax_cross_entropy_with_logits
  2. 这是一个很好的做法,特别是在开始使用深度学习/张量流时,从一个更简单的模型开始。您还没有告诉我们您有多少课程,但我们假设您有10门课程。只是任何简单模型应该比10%好,所以这表明一些根本错误。错误的是要进一步阐述你的模型;正确的做法是简化逻辑回归(只是单个矩阵乘法,然后是softmax层)并检查性能。这样,您就可以将网络架构与优化和丢失功能分开(部分无论如何)。然后从那里建立复杂性。
  3. 您的数据:您还没有描述数据,尽管我们喜欢神经网络的力量(我们这样做!),理解并仔细地预处理数据很重要。例如,当在颜色通道上进行一些预处理时,经常发现着名的SVHN数据集(谷歌街景房屋号码)更容易分类。如果您阅读了许多计算机视觉论文的细则,就会有类似的数据预处理。也许这不是这种情况,但是简化网络以更好地理解数据(上面的项目)应该有所帮助。
  4. 最后,这可能不会导致您的问题,但为什么您使用tf.pad?您可能会发现更容易使用的内容padding=SAME而不是padding=VALID,因此无需进行tf.pad次调用。
  5. 毕竟,使用tensorboard来帮助分析性能以及如何改进。值得学习它的麻烦:https://www.tensorflow.org/get_started/summaries_and_tensorboard

答案 2 :(得分:0)

我认为你的模型有点简单 当我尝试使用更多参数的模型时, 测试准确率为86%。

  

W_conv2 = weight_variable([5,5,32,64])#feature maps 32 => 64
  b_conv2 = bias_variable([64])
  W_conv3 = weight_variable([5,5,64,128])#feature maps 64 => 128
  b_conv3 = bias_variable([128])
  W_fc1 = weight_variable([4 * 4 * 128,2048])#feature maps 64 => 2048
  b_fc1 = bias_variable([2048])

这种conv层的设计灵感来自VGG-16网络。在VGG-16网络中,每个转换层堆栈的特征映射数量加倍。 特征图的数量取决于任务,但我认为这个设计原则对于交通标志识别任务很有用。

如果您对我的实验感兴趣,请参阅我的github repo。 https://github.com/satojkovic/DeepTrafficSign/tree/sof_test

答案 3 :(得分:0)

最好使用:

with tf.variable_scope('Conv_1'):
        W_conv1 = weight_variable([3,3, FLAGS.img_channels, 32])
        W_conv1_2 = weight_variable([3,3, 32, 32])

而不是:

with tf.variable_scope('Conv_1'):
        W_conv1 = weight_variable([5, 5, FLAGS.img_channels, 32])

您的网络失去了有限的有限信息。

喜欢更正统的参数,比如

output = tf.nn.max_pool(input, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID', name=identifier)

结束:

output = tf.nn.max_pool(x, ksize=[1, 3, 3, 1],
                          strides=[1, 2, 2, 1], padding='VALID', name='pooling2')

这也会阻止你使用常量填充。 旁注:我认为你应该用不同于零的东西填充,我会认为它增加了噪音...... 最后一个提示,我认为你的学习率太高,从更像1e-3,1e-4开始

使用AdamOptimizer,它可以创造奇迹......它在查看错误空间时基本上具有第二个数量级,这使其具有优于基本MomentumOptimizer的优势。

祝你好运

答案 4 :(得分:0)

您假设data_format = "NWHC"

x_image = tf.reshape(x, [-1, FLAGS.img_width, FLAGS.img_height, FLAGS.img_channels])

但仅支持"NHWC"(默认)和"NCHW"