В настоящее время я использую 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.
Я застрял на этом шаге в течение длительного времени, и я не могу продолжить. Любая помощь / предложения будут полезны.