Могу ли я получить градиент тензора по отношению к вводу, не применяя ввод?

Например, мне нужно вычислить градиент cross_entropy по отношению к x, но мне нужно применить другое значение к функции градиента.

То есть:

f'(x)|x = x_t

Я думаю, что функция tf.gradients() даст градиент только в x = x. Так предоставляет ли tensorflow какую-либо из этих функций?


person Sharyn Hu    schedule 10.04.2018    source источник


Ответы (1)


Результатом tf.gradients является тензор (список тензоров в целом), а не значение float. В некотором смысле этот тензор является функцией: его можно вычислить в любой точке. Клиенту нужно только ввести желаемое входное значение.

Пример:

features = 3
n_samples = 10
hidden = 1

X = tf.placeholder(dtype=tf.float32, shape=[n_samples, features])
Y = tf.placeholder(dtype=tf.float32, shape=[n_samples])

W = tf.Variable(np.ones([features, hidden]), dtype=tf.float32, name="weight")
b = tf.Variable(np.ones([hidden]), dtype=tf.float32, name="bias")

pred = tf.add(tf.matmul(X, W), b)
cost = tf.reduce_mean(tf.pow(pred - Y, 2))

dc_dw, dc_db = tf.gradients(cost, [W, b])

session.run(tf.global_variables_initializer())

# Let's compute `dc_dw` at `ones` matrix.
print(dc_dw.eval(feed_dict={X: np.ones([n_samples, features]), 
                            Y: np.ones([n_samples])}))
person Maxim    schedule 10.04.2018
comment
Большое спасибо. Но на самом деле мне нужно обновить новую переменную x_t, начальное значение которой равно x, согласно производной. На самом деле моя первоначальная мысль состояла в том, чтобы сохранить исходный граф, но просто добавить новый узел x_t, и теперь это кажется невозможным. Я думаю, что мне нужно внести много изменений в мою модель, чтобы достичь этой цели. - person Sharyn Hu; 11.04.2018