dch*_*kov 5 machine-learning loss scikit-learn tensorflow
嗨,我正在尝试进入 tensorflow,但感觉有点傻。TF 中的 log_loss 与 sklearn 的不同吗?
这是我的代码中的一些行,我是如何计算的:
from sklearn.metrics import log_loss
tmp = np.array(y_test)
y_test_t = np.array([tmp, -(tmp-1)]).T[0]
tf_log_loss = tf.losses.log_loss(predictions=tf.nn.softmax(logits), labels=tf_y)
with tf.Session() as sess:
# training
a = sess.run(tf.nn.softmax(logits), feed_dict={tf_x: xtest, keep_prob: 1.})
print(" sk.log_loss: ", log_loss(y_test, a,eps=1e-7 ))
print(" tf.log_loss: ", sess.run(tf_log_loss, feed_dict={tf_x: xtest, tf_y: y_test_t, keep_prob: 1.}))
Run Code Online (Sandbox Code Playgroud)
我得到的输出
Epoch 7, Loss: 0.4875 Validation Accuracy: 0.818981
sk.log_loss: 1.76533018874
tf.log_loss: 0.396557
Epoch 8, Loss: 0.4850 Validation Accuracy: 0.820738
sk.log_loss: 1.77217639627
tf.log_loss: 0.393351
Epoch 9, Loss: 0.4835 Validation Accuracy: 0.823374
sk.log_loss: 1.78479079656
tf.log_loss: 0.390572
Run Code Online (Sandbox Code Playgroud)
似乎 whiletf.log_loss收敛sk.log_loss发散。
我有同样的问题。查找tf.losses.log_loss的源代码后,其关键行显示发生了什么:
losses = - math_ops.multiply(labels, math_ops.log(predictions + epsilon))
- math_ops.multiply((1 - labels), math_ops.log(1 - predictions + epsilon))
Run Code Online (Sandbox Code Playgroud)
它是二元对数损失(即每个类都被认为是非排他性的)而不是多类对数损失。
当我使用概率(而不是对数)时,我无法使用tf.nn.softmax_cross_entropy_with_logits(不过,我可以应用对数)。我的解决方案是手动实现日志丢失:
loss = tf.reduce_sum(tf.multiply(- labels, tf.log(probs))) / len(probs)
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
1298 次 |
| 最近记录: |