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