Numpy 如何在python keras中计算张量上的浮点数的熵

Numpy 如何在python keras中计算张量上的浮点数的熵,numpy,tensorflow,keras,scipy,entropy,Numpy,Tensorflow,Keras,Scipy,Entropy,我一直在努力,但无法让它工作。希望有人能帮我 我想计算张量的每一行上的熵因为我的数据是浮点数而不是整数,我想我需要使用bin_直方图。 例如,我的数据样本是tensor=[[0.2,-0.1,1],[2.09,-1.4,0.9]] 仅供参考,我的模型是seq2seq,用tensorflow后端的keras编写的 这是到目前为止我的代码:我需要更正rev\u entropy class entropy_measure(Layer): def __init__(self, beta,bat

我一直在努力,但无法让它工作。希望有人能帮我

我想计算
张量的每一行上的
因为我的数据是浮点数而不是整数,我想我需要使用bin_直方图。

例如,我的数据样本是
tensor=[[0.2,-0.1,1],[2.09,-1.4,0.9]]

仅供参考,我的模型是
seq2seq
,用tensorflow后端的
keras
编写的

这是到目前为止我的代码:我需要更正
rev\u entropy

class entropy_measure(Layer):

    def __init__(self, beta,batch, **kwargs):
        self.beta = beta
        self.batch = batch
        self.uses_learning_phase = True
        self.supports_masking = True
        super(entropy_measure, self).__init__(**kwargs)

    def call(self, x):
        return K.in_train_phase(self.rev_entropy(x, self.beta,self.batch), x)

    def get_config(self):
        config = {'beta': self.beta}
        base_config = super(entropy_measure, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

    def rev_entropy(self, x, beta,batch):

        for i in x:
            i = pd.Series(i)
            p_data = i.value_counts()  # counts occurrence of each value
            entropy = entropy(p_data)  # get entropy from counts
            rev = 1/(1+entropy)
            return rev

        new_f_w_t = x * (rev.reshape(rev.shape[0], 1))*beta

        return new_f_w_t
非常感谢您的任何意见:)

您似乎在这个问题上遇到了一系列问题。我会在这里解决的

根据您的代码,以以下形式计算熵:

scipy.stats.entropy(pk,qk=None,base=None)

计算给定概率值的分布熵

如果只给出概率pk,熵计算为S= -总和(pk*log(pk),轴=0)

Tensorflow不提供直接的API来计算每行张量的
熵。我们需要做的是实施上述公式

import tensorflow as tf
import pandas as pd
from scipy.stats import entropy

a = [1.1,2.2,3.3,4.4,2.2,3.3]
res = entropy(pd.value_counts(a))

_, _, count = tf.unique_with_counts(tf.constant(a))
# [1 2 2 1]
prob = count / tf.reduce_sum(count)
# [0.16666667 0.33333333 0.33333333 0.16666667]
tf_res = -tf.reduce_sum(prob * tf.log(prob))

with tf.Session() as sess:
    print('scipy version: \n',res)
    print('tensorflow version: \n',sess.run(tf_res))

scipy version: 
 1.329661348854758
tensorflow version: 
 1.3296613488547582
然后我们需要定义一个函数,并根据上面的代码在自定义层中通过
tf.map\u fn
实现
for loop

def rev_entropy(self, x, beta,batch):
    def row_entropy(row):
        _, _, count = tf.unique_with_counts(row)
        prob = count / tf.reduce_sum(count)
        return -tf.reduce_sum(prob * tf.log(prob))

    value_ranges = [-10.0, 100.0]
    nbins = 50
    new_f_w_t = tf.histogram_fixed_width_bins(x, value_ranges, nbins)
    rev = tf.map_fn(row_entropy, new_f_w_t,dtype=tf.float32)

    new_f_w_t = x * 1/(1+rev)*beta

    return new_f_w_t

请注意,隐藏层不会产生无法向后传播的梯度,因为
是基于统计概率值计算的。也许你需要重新考虑你的隐藏层结构。

非常感谢你,你是个救命稻草:),你是如何计算实数的熵而不使用bin_直方图的?你知道我的意思,问题是我没有整数,它们是浮点数,这就是为什么我说微分熵。我认为微分熵也可能没有帮助,因为变量的总和必须是1,这在我的例子中不是真的。这就是为什么我需要在计算最终熵之前首先使用bin_直方图。我说得通吗?你能把你的答案改成包括数值范围=[-10.0,100.0]nbins=50个新的数值范围=tf。直方图固定宽度范围(x,数值范围,nbins)rev=tf。映射fn(行熵,新的数值范围),这样我就可以接受这个被接受的答案了。我还有一个问题。在“行熵”之后,张量的形状从(?,20)变为(?),这就是为什么我收到一个错误,说ValueError:Input 0与layer repeater不兼容:预期ndim=2,发现ndim=None。你对此有什么想法/意见吗?谢谢你:)@sarii
熵与实数无关,只与它们的分布有关。例如,我将
[1,2,3,4,2,3]
更改为
[1.1,2.2,3.3,4.4,2.2,3.3]
不会影响
熵的值。你的
ValueError
出现在哪一行?@sarii我的意思是
entropy
是基于概率值而不是实数值计算的。当然,如果你想把数据放在同一个箱子里,我会改成
bin\u直方图。