tensorflow - 在计算每行张量值的连续熵时获取 inf
问题描述
我试图计算一个张量,因为我的数字在张量中太小,continuous entropy
所以我收到的大部分时间:-inf
tf.Tensor([-inf -inf -inf -inf -inf -inf -inf], shape=(7,), dtype=float32)
这是我拥有的张量的子样本:
tf_ent = tf.constant([ [0.096, -0.00065, 0.99, 0.01 ],
[0.097, 0.033, 0.025, 0.005 ],
[0.009, 0.0001, 0.0009, 0.0033],
[0.00060, 0.001, 0.03, 0.0005 ],
[0.0049, -0.08, -0.05, -0.00036],
[0.09 , -0.45, 0.087, 0.0023 ],
[0.3, -0.23, 0.82, -0.28 ]])
这就是我在each
这个张量的样本上计算连续熵的方式:
import tensorflow as tf
import math
tf.enable_eager_execution()
def score(X):
def entropy(data):
if data is not None:
data = tf.reshape(data, shape=[1, -1])
num_samples = data.shape[0]
if len(data.shape) == 1:
num_dimensions = 1
else:
num_dimensions = data.shape[1]
detCov = tf.linalg.det(tf.cast(tf.matmul(data, tf.transpose(data)),tf.int32)/tf.cast(num_samples,tf.int32))
normalization = tf.math.pow(tf.cast((tf.math.multiply(2, tf.math.multiply(np.pi, tf.math.exp(1.0)))),tf.int32), num_dimensions)
if detCov == 0:
return -np.inf
else:
return 0.5 * tf.math.log(tf.math.multiply(tf.cast(normalization,tf.float32),tf.cast(detCov, tf.float32)))
rev = tf.map_fn(entropy, X, dtype=tf.float32)
return rev
ent_p = score(tf_ent)
所以我的问题是,如果我通过 say 将张量中的所有元素倍增是否可以10000
,所以我的大部分行都会得到每行的分数?或者它在概念上可能没有意义?
解决方案
我确定您意识到您正在看到这种行为,因为您将一个非常小的数字传递给了日志函数。如果我们试图除以一个非常小的数字,同样的事情也会发生。在考虑了 a(或任何 dtype)的数值精度限制float32
之后,我们最终会被精确地除以零。
避免这个问题的最常见方法(用于大多数甚至所有“开箱即用”的损失函数)是epsilon
在我们取对数或除法时添加一个非常小的常数值(通常称为 )。原理是 epsilon 足够小,以至于它改变损失值的程度可以忽略不计,但它足够大,不必实际除以零。
所以也许改成这样:
分数(X): 定义熵(数据): epsilon = tf.constant(0.000001) 如果数据不是无: 数据 = tf.reshape(数据,形状=[1,-1]) num_samples = data.shape[0] 如果 len(data.shape) == 1: num_dimensions = 1 别的: num_dimensions = data.shape[1] detCov = tf.linalg.det(tf.cast(tf.matmul(data, tf.transpose(data)),tf.int32)/tf.cast(num_samples,tf.int32)) 归一化 = tf.math.pow(tf.cast((tf.math.multiply(2, tf.math.multiply(np.pi, tf.math.exp(1.0)))),tf.int32), num_dimensions) 如果 detCov == 0: 返回-np.inf 别的: 返回 0.5 * tf.math.log( epsilon + tf.math.multiply(tf.cast(normalization,tf.float32),tf.cast(detCov, tf.float32))) rev = tf.map_fn(熵,X,dtype=tf.float32) 返回转速 ent_p = 分数(tf_ent)
推荐阅读
- aws-lambda - 对 NodeJS lambda 使用 Typescript 而不是 Javascript 会增加冷启动时间吗?
- javascript - Vue.js - 显示 base64 图像字符串时出错(431,请求标头字段太大)
- azure - 在 Azure 上为静态网站添加自定义域
- mongodb - Docker-compose 缓存我的 mongodb 密码
- java - 为什么bazel将资源从子目录复制到jar的顶层
- html - 如何在Angular中超时后更新html页面视图
- c++ - 迭代一个 STL 集直到倒数第二个索引
- arrays - mips 完全是新手,有人能告诉我在这个项目中我在哪里出错以反转 .byte 和 .word 数组吗?
- javascript - Uncaught (in promise) TypeError: listing.owner is undefined when trying to submit
- python - 如何从给定句子中删除关键字