gpt4 book ai didi

python - tensorflow 仅以单精度计算交叉熵吗?

转载 作者:行者123 更新时间:2023-12-01 08:26:57 25 4
gpt4 key购买 nike

我试图完全理解 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 - siglose all precisionsig接近零

关于python - tensorflow 仅以单精度计算交叉熵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54180194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com