我试图在Tensorflow中实现一个5层深度卷积神经网络,其中包含3个卷积层,然后是2个完全连接的层。我目前的实施情况如下。
APP#1
由于某些未知原因,该模型似乎没有将其准确度提高到10%以上。我一直在撞墙,试图找出原因。我使用softmax损失成本函数(如here所述)和动量优化器。使用的数据集是GTSRB dataset。
虽然我可以添加各种深度学习功能(例如自适应学习率等)以提高准确性,但我怀疑为什么基本的CNN模型表现如此糟糕。
有什么明显可以解释为什么它没有像预期的那样学习?或者,有什么我可以尝试帮助诊断问题?
任何帮助将不胜感激!
答案 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)
有几点值得帮助:
tf.nn.softmax_cross_entropy_with_logits
。tf.pad
?您可能会发现更容易使用的内容padding=SAME
而不是padding=VALID
,因此无需进行tf.pad
次调用。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"
。