Похоже, у вас есть ряд вопросов по этому вопросу.Я улажу это здесь.
Вы вычисляете 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
рассчитывается на основе статистических вероятностных значений.Возможно, вам нужно переосмыслить структуру скрытого слоя.