我试图从研究论文中复制一个深度卷积神经网络。我已经实现了这个架构,但是在10个时代之后,我的交叉熵损失突然增加到无穷大。这可以在下面的图表中看到。您可以忽略问题发生后准确性发生的变化。
Here是github存储库,其中包含架构图片
在做了一些研究后,我认为使用AdamOptimizer或relu可能是个问题。
x = tf.placeholder(tf.float32, shape=[None, 7168])
y_ = tf.placeholder(tf.float32, shape=[None, 7168, 3])
#Many Convolutions and Relus omitted
final = tf.reshape(final, [-1, 7168])
keep_prob = tf.placeholder(tf.float32)
W_final = weight_variable([7168,7168,3])
b_final = bias_variable([7168,3])
final_conv = tf.tensordot(final, W_final, axes=[[1], [1]]) + b_final
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=final_conv))
train_step = tf.train.AdamOptimizer(1e-5).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(final_conv, 2), tf.argmax(y_, 2))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
修改 如果有人感兴趣,解决方案是我基本上输入了不正确的数据。
答案 0 :(得分:3)
在你的损失图中跳跃是非常奇怪的......
我希望你专注于几点:
tf.clip
,这样你的渐变不会爆炸和内爆您还可以使用张量板来跟踪损失和准确性
请参阅下面的softmax公式:
leaky relu
leaky relu
作为激活功能非常重要,这样可以增加非线性,从而提高性能答案 1 :(得分:3)
解决方案:控制解决方案空间。这可能意味着在训练时使用较小的数据集,可能意味着使用较少的隐藏节点,可能意味着以不同的方式初始化wb。您的模型即将达到损耗未定义的点,这可能是由于未定义梯度或final_conv信号造成的。
原因:有时无论什么情况,都会达到数值不稳定性。最终添加机器epsilon以防止被零除(此处是交叉熵损失)将无济于事,因为即使那样,该数字也不能由您使用的精度来准确表示。 (参考:https://en.wikipedia.org/wiki/Round-off_error和https://floating-point-gui.de/basic/)
注意事项:
1)调整epsilons时,请确保与您的数据类型一致(使用您使用的精度的机器epsilon,在这种情况下float32是1e-6 ref:https://en.wikipedia.org/wiki/Machine_epsilon和python numpy machine epsilon。 / p>
2)以防万一,其他人对此感到困惑:Adamoptimizer的构造函数中的值是学习率,但是您可以设置epsilon值(参考:How does paramater epsilon affects AdamOptimizer?和https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer)< / p>
3)张量流的数值不稳定性存在并且难以克服。是的,有tf.nn.softmax_with_cross_entropy,但这太具体了(如果您不想要softmax,该怎么办?)。请参阅Vahid Kazemi的“有效Tensorflow”以获取深入的解释:https://github.com/vahidk/EffectiveTensorflow#entropy
答案 2 :(得分:1)
您可能希望在Adam优化器中使用不同的epsilon值(例如0.1 - 1.0)。documentation中提到了这一点:
一般来说,epsilon的默认值1e-8可能不是一个好的默认值。例如,在ImageNet上训练Inception网络时,当前的好选择是1.0或0.1。