Результаты optimizer.apply_gradients () отсутствуют - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь применить дополнительный шаг - скажем, простое умножение - к градиентам относительно подмножества обучаемых переменных.Вот что имеет:

def do_something(tgvt):
new_tgvt = []
for gv in tgvt:
    if gv[0] == None:
        sh = tf.shape(gv[1])
        gv0 = tf.zeros(sh)
        gv0t = tf.convert_to_tensor(gv0)
        new_tgvt.append((gv0t, gv[1]))
    else:
        new_tgvt.append((gv[0]*5, gv[1]))

return new_tgvt

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 1e-5)
params = tf.trainable_variables()
pars = [params[27], params[29]]
gradients = optimizer.compute_gradients(cost,pars)
tgv = [(g,v) for (g,v) in gradients]

new_gradients = do_something(tgv)
train_op = optimizer.apply_gradients(new_gradients)

session = tf.Session()
session.run(tf.global_variables_initializer())
total_iterations = 0  # record the total iterations
for i in range(total_iterations,total_iterations + num_iterations):
    x_batch, y_batch = data.train.next_batch(batch_size)
    feed_dict = {X: x_batch, y_true: y_batch, keep_prob: 0.5}
    result = session.run([train_op, pars], feed_dict=feed_dict)

, когда я печатаю result, градиенты будут None:

print(result[0])
print((result[1][0]).shape)      
print((result[1][1]).shape)

None
(5, 5, 1, 36)
(5, 5, 36, 64)

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 24 сентября 2018

Из документов: train_op должен вернуть:

Операция, которая применяет указанные градиенты.

Вызов sess.run на train_op, как ожидается, дастNone, поскольку эта операция не приводит к значению, скорее, она применяется.

Почему бы вам не проверить это самостоятельно, напечатав старое и обновленное значение для одной из переменных ??

...