При вычислении потерь земного движителя как функции потерь на 2D-массивах в Tensorflow 1.15 я получил эту ошибку:

Вот функция потерь EMD, которую я использую в Autoencoder:

      def tril_indices(n, k=0):
m1 = tf.tile(tf.expand_dims(tf.range(n), axis=0), [n, 1])
m2 = tf.tile(tf.expand_dims(tf.range(n), axis=1), [1, n])
mask = (m1 - m2) >= -k
ix1 = tf.boolean_mask(m2, tf.transpose(mask))
ix2 = tf.boolean_mask(m1, tf.transpose(mask))
return ix1, ix2

def ecdf(p):
n = p.get_shape().as_list()[-1]
indices = tril_indices(n)
indices = tf.transpose(tf.stack([indices[1], indices[0]]))
ones = tf.ones([n * (n + 1) / 2])
triang = tf.scatter_nd(indices, ones, [n, n])
return tf.matmul(p, triang)

def emd_loss(p, p_hat, r=2, scope=None):
ecdf_p = ecdf(p)
ecdf_p_hat = ecdf(p_hat)
emd = tf.reduce_mean(tf.pow(tf.abs(ecdf_p - ecdf_p_hat), r), axis=-1)
emd = tf.pow(emd, 1 / r)
return tf.reduce_mean(emd)

def my_loss(y_true, y_pred):
y_true = tf.convert_to_tensor(x_train,  dtype = tf.float32)
y_pred = tf.convert_to_tensor(x_train, dtype= tf.float32)

loss = emd_loss(y_true, y_pred)
return loss

И это архитектура автоэнкодера.

Но я получаю такую ​​ошибку:

ValueError: переменная <tf.Variable 'conv1d / kernel:0' shape = (3, 1, 256) dtype = float32> имеет Noneдля градиента. Убедитесь, что для всех ваших операций определен градиент (т.е. что они дифференцируемы). Обычные операции без градиента: K.argmax, K.round, K.eval.

0 ответов

Другие вопросы по тегам