- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图完全理解 TensorFlow 中交叉熵的计算。在下面的代码中,使用 numpy 我生成 double 随机双数据 x
,将其转换为logits
对于二元分类(即每个数据点只有一个 logit),将其通过 sig
中的 sigmoid 进行映射,计算交叉熵ce
然后是平均交叉熵mce
。 TensorFlow 中的类似计算如下。我的问题是:
为什么我的平均交叉熵 mce
之间存在差异(在 numpy 中使用 double 计算)和 TensorFlow tf.losses.sigmoid_cross_entropy
?
我不知道,我在哪里忘记指定 TensorFlow 以 double 计算。此外,如果我使用 tf.nn.reduce_mean
,参见 mcetf2
的计算,根据每个数据点计算的交叉熵,然后我得到我的 numpy 结果。差异从何而来?谢谢!
import numpy as np
import tensorflow as tf
#%%
# Number of data pionts nx and dimension dx
nx = 10
dx = 4
# Input data
x = np.random.rand(nx,dx)
#%% Numpy
# Transform to logits for binary classification with sigmoid
matrix = np.random.rand(dx,1)
logits = np.matmul(x,matrix)
print('Logits dimensions: %s' % str(logits.shape))
# Sigmoid
def sigmoid(x):
return 1. / (1. + np.exp(-x))
sig = sigmoid(logits)
print('Sigmoid dimensions: %s' % str(sig.shape))
# Discrete probabilities
p = np.random.randint(2,size=nx)[:,np.newaxis]
print('Probability dimensions: %s'% str(p.shape))
# Cross entropy for each data point
ce = p*np.log(1/sig)+(1-p)*np.log(1/(1-sig))
# Mean cross entropy
mce = np.mean(ce)
print('MCE with np: %.16f' % mce)
#%% Tensorflow
xp = tf.placeholder(dtype=tf.float64,shape=[None,dx])
pp = tf.placeholder(dtype=tf.float64,shape=[None,1])
model = xp
c1 = tf.constant(matrix,dtype=tf.float64)
model = tf.matmul(xp,c1)
sigtf = tf.nn.sigmoid(model)
cetf = tf.nn.sigmoid_cross_entropy_with_logits(labels=pp,logits=model)
mcetf = tf.losses.sigmoid_cross_entropy(pp,model)
mcetf2 = tf.reduce_mean(cetf)
sess = tf.Session()
feed = {xp:x,pp:p}
print('Error in logits: %.16f' % np.max(np.abs(sess.run(model,feed)-logits)))
print('Error in sigmoid: %.16f' % np.max(np.abs(sess.run(sigtf,feed)-sig)))
print('Error in CE: %.16f' % np.max(np.abs(sess.run(cetf,feed)-ce)))
print('Error in MCE: %.16f' % np.abs(sess.run(mcetf,feed)-mce))
print('Error in MCE2: %.16f' % np.abs(sess.run(mcetf2,feed)-mce))
sess.close()
Logits dimensions: (10, 1)
Sigmoid dimensions: (10, 1)
Probability dimensions: (10, 1)
MCE with np: 0.7413128316195762
Error in logits: 0.0000000000000000
Error in sigmoid: 0.0000000000000000
Error in CE: 0.0000000000000009
Error in MCE: 0.0000000297816550
Error in MCE2: 0.0000000000000001
最佳答案
(32 位)float
的使用似乎是硬编码在 compute_weighted_loss()
中sigmoid_cross_entropy
使用的函数在 tensorflow 中
作为一个小问题,您用于计算 ce
的 numpy 代码在数值上不是很稳定 - 但它不会影响这里的任何内容。我将其实现为:
ce = p * -np.log(sig) + (1-p) * -np.log1p(-sig)
使用log1p
是主要的变化。您使用 1 - sig
将 lose all precision当sig
接近零
关于python - tensorflow 仅以单精度计算交叉熵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54180194/
我们有一个 WPF 应用程序,允许用户下载加密内容,并且我们希望提供离线解密该内容的功能。我的想法是下载 key 并使用 DPAPI 存储它们,但我在使用熵参数时遇到了问题。 是否有任何方法可以生成熵
在 php.ini 的 session 部分,有一个名为 session.entropy_length 的指令。 我知道它用于使 session ID 的生成“更加随机”。 它如何使 session
在 php.ini 的 session 部分,有一个名为 session.entropy_length 的指令。 我知道它用于使 session ID 的生成“更加随机”。 它如何使 session
我使用决策树算法来解决二元分类问题,目标是最大限度地减少分类的误报(最大化阳性预测值)(诊断工具的成本非常高) 。 有没有办法在基尼/熵分割标准中引入权重来惩罚误报错误分类? Here例如,修改后的基
我想检查我的 std::random_device 实现是否具有非零熵(即非确定性),使用 std::random_device::entropy() 函数。然而,根据至cppreference.co
我在 tensorflow_decision_forests 文档 ( https://github.com/tensorflow/decision-forests ) ( https://www.t
我是一名优秀的程序员,十分优秀!