Dev*_*lam 7 python machine-learning deep-learning conv-neural-network tensorflow
我试图从一篇研究论文中复制一个深度卷积神经网络。我已经实现了这个架构,但是在 10 个 epoch 之后,我的交叉熵损失突然增加到无穷大。这可以在下面的图表中看到。您可以忽略问题发生后准确性发生的情况。
这是带有架构图片的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))
Run Code Online (Sandbox Code Playgroud)
编辑 如果有人感兴趣,解决方案是我基本上输入了不正确的数据。
解:控制解空间。这可能意味着在训练时使用较小的数据集,这可能意味着使用更少的隐藏节点,这可能意味着以不同的方式初始化您的 wb。您的模型达到了损失未定义的程度,这可能是由于梯度未定义或 final_conv 信号造成的。
为什么:有时无论如何都会达到数值不稳定。最终添加一个机器 epsilon 以防止除以零(这里的交叉熵损失)也无济于事,因为即使如此,您使用的精度也无法准确表示该数字。(参考:https://en.wikipedia.org/wiki/Round-off_error和https://floating-point-gui.de/basic/)
注意事项:
1)在调整 epsilon 时,请确保与您的数据类型保持一致(使用您正在使用的精度的机器 epsilon,在您的情况下 float32 是 1e-6 参考:https : //en.wikipedia.org/wiki /Machine_epsilon和python numpy machine epsilon。
2)以防万一阅读本文的其他人感到困惑:Adamoptimizer 的构造函数中的值是学习率,但您可以设置 epsilon 值(参考:参数 epsilon 如何影响 AdamOptimizer?和https://www.tensorflow。 org/api_docs/python/tf/train/AdamOptimizer )
3)张量流的数值不稳定性存在且难以解决。是的,有 tf.nn.softmax_with_cross_entropy 但这太具体了(如果你不想要 softmax 怎么办?)。请参阅 Vahid Kazemi 的“Effective Tensorflow”以获得有见地的解释:https : //github.com/vahidk/EffectiveTensorflow#entropy
归档时间: |
|
查看次数: |
7602 次 |
最近记录: |