首页 > 解决方案 > 在计算每行张量值的连续熵时获取 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,所以我的大部分行都会得到每行的分数?或者它在概念上可能没有意义?

标签: tensorflowentropycontinuous

解决方案


我确定您意识到您正在看到这种行为,因为您将一个非常小的数字传递给了日志函数。如果我们试图除以一个非常小的数字,同样的事情也会发生。在考虑了 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)

推荐阅读