Градиент функции оценивается по партии - PullRequest
0 голосов
/ 01 мая 2019

Я хочу использовать Tensorflow для вычисления градиентов функции.Однако, если я использую функцию tf.gradients, она возвращает один список градиентов.Как вернуть список для каждой точки пакета?

# in a tensorflow graph I have the following code
tf_x = tf.placeholder(dtype=tf.float32, shape=(None,N_in), name='x')
tf_net #... conveniently defined neural network
tf_y = tf.placeholder(dtype=tf.float32, shape=(None,1), name='y')

tf_cost = (tf_net(tf_x) - tf_y)**2  # this should have length N_samples because I did not apply a tf.reduce_mean

tf_cost_gradients = tf.gradients(tf_cost,tf_net.trainable_weights)

Если мы запустим его в сеансе тензорного потока,

# suppose myx = np.random.randn(N_samples,N_in) and myy conveniently chosen
feed = {tf_x:myx, tx_y:myy}
sess.run(tf_cost_gradients,feed)

Я получу только один список, а не список длякаждый образец, как я хотел бы.Я могу использовать

for i in len(myx):
    feed = {tf_x:myx[i], tx_y:myy[i]}
    sess.run(tf_cost_gradients,feed)

, но это очень медленно!Что я могу сделать?Спасибо

1 Ответ

0 голосов
/ 01 мая 2019

Несмотря на то, что в tf.gradients есть параметр aggregation_method, получить отдельные градиенты непросто.

aggregation_method: Specifies the method used to combine gradient terms.

Пожалуйста, смотрите эти темы:

https://github.com/tensorflow/tensorflow/issues/15760 https://github.com/tensorflow/tensorflow/issues/4897

В одном из потоков (# 4897) Ян Гудфеллоу делает следующее предложение для ускорения вычисления индивидуальных градиентов:

This is only pseudocode, but basic idea is:

examples = tf.split(batch)
weight_copies = [tf.identity(weights) for x in examples]
output = tf.stack(f(x, w) in zip(examples, weight_copies))
cost = cost_function(output)
per_example_gradients = tf.gradients(cost, weight_copies)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...