«Нет» градиент возвращается для переменных - PullRequest
0 голосов
/ 21 февраля 2020

В настоящее время я использую TensorFlow version 1.14.

. В приведенном ниже коде я пытаюсь создать фиктивную модель, которая принимает 2 входа и обеспечивает два выхода со всеми весами, установленными в единицу, и смещениями в нули. (Однослойный персептрон). Я определяю пользовательскую функцию потерь, которая вычисляет якобиан входного слоя по сравнению с выходным слоем.

# Prior function
def f_i(x):
    x1 = np.arctanh(x)
    return np.exp(-x1**2)

B = np.random.choice(x, (10000,2), p = f_i(x)/np.sum(f_i(x)))

def my_loss(y_pred, y_true):
    jacobian_tf = jacobian_tensorflow3(sim.output, sim.input)
    loss = tf.abs(tf.linalg.det(jacobian_tf))
    return K.mean(loss)

def jacobian_tensorflow3(x,y, verbose=False):    
    jacobian_matrix = []
    it = tqdm(range(ndim)) if verbose else range(ndim)
    for o in it:
        grad_func = tf.gradients(x[:,o], y)
        jacobian_matrix.append(grad_func[0])
    jacobian_matrix = tf.stack(jacobian_matrix)
    jacobian_matrix1 = tf.transpose(jacobian_matrix, perm=[1,0,2])
    return jacobian_matrix1

sim = Sequential()
sim.add(Dense(2, kernel_initializer='ones', bias_initializer='zeros', activation='linear', input_dim=2))
sim.compile(optimizer='adam', loss=my_loss)

sim.fit(B, np.random.random(B.shape), batch_size=100, epochs=2)

Хотя эта модель работает для получения результата матрицы Якоби и также не имеет проблем с компиляцией, но когда я запускаю sim.fit, я получаю следующую ошибку:

ValueError: Variable <tf.Variable 'dense_14/bias:0' shape=(2,) dtype=float32> has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

Я застрял на этом шаге в течение длительного времени, и я не могу продолжить. Любая помощь / предложения будут полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...