Как рассчитать энтропию по числам с плавающей запятой над тензором в Python Keras - PullRequest
0 голосов
/ 25 мая 2019

Я боролся с этим и не мог заставить его работать.надеюсь, что кто-то может помочь мне с этим.

Я хочу вычислить entropy в каждой строке tensor. Поскольку мои данные являются числами с плавающей точкой, а не целыми числами, я думаю, что мне нужно использовать bin_histogram.

Например, образец моих данных: tensor =[[0.2, -0.1, 1],[2.09,-1.4,0.9]]

Только для информации Моя модельseq2seq и записан в keras с бэкэндом тензорного потока.

Это мой код на данный момент: мне нужно исправить rev_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

Любой ввод очень ценится :)

1 Ответ

1 голос
/ 26 мая 2019

Похоже, у вас есть ряд вопросов по этому вопросу.Я улажу это здесь.

Вы вычисляете entropy в следующей форме scipy.stats.entropy согласно вашему коду:

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

Рассчитать энтропию распределения для заданных значений вероятности.

Если даны только вероятности pk, энтропия рассчитывается как S = -сумма (pk * log (pk), ось = 0) .

Tensorflow не предоставляет прямого API для вычисления entropy для каждой строки тензора,Нам нужно реализовать вышеприведенную формулу.

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

Затем нам нужно определить функцию и достичь от for loop до tf.map_fn в вашем пользовательском слое в соответствии с приведенным выше кодом.

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

Отмечает, что скрытый слой не будет создавать градиент, который не может распространяться в обратном направлении, поскольку entropy рассчитывается на основе статистических вероятностных значений.Возможно, вам нужно переосмыслить структуру скрытого слоя.

...