2018-04-06

TensorFlow中的自動梯度
首先優化函數的定義就是前面一部分opt
=tf.train.GradientDescentOptimizer(learning_rate),定義好優化函數之后,可以通過grads_and_vars = opt.compute_gradients(loss, <list of variables>)來計算loss對于一個變量列表里面每一個變量的梯度,得到的grads_and_vars是一個list of tuples,list中的每個tuple都是由(gradient, variable)構成的,我們可以通過get_grads_and_vars = [(gv[0], gv[1]) for gv in grads_and_vars]將其分別取出來,然后通過opt.apply_gradients(get_grads_and_vars)來更新里面的參數,下面我們舉一個小例子。

import tensorflow as tf

x = tf.Variable(5, dtype=tf.float32)
y = tf.Variable(3, dtype=tf.float32)

z = x**2 + x * y + 3

sess = tf.Session()
# initialize variable
sess.run(tf.global_variables_initializer())

# define optimizer
optimizer = tf.train.GradientDescentOptimizer(0.1)

# compute gradient z w.r.t x and y
grads_and_vars = optimizer.compute_gradients(z, [x, y])

# fetch the variable
get_grads_and_vars = [(gv[0], gv[1]) for gv in grads_and_vars]


# dz/dx = 2*x + y= 13
# dz/dy = x = 5
print('grads and variables')
print('x: grad {}, value {}'.format(
sess.run(get_grads_and_vars[0][0]), sess.run(get_grads_and_vars[0][1])))

print('y: grad {}, value {}'.format(
sess.run(get_grads_and_vars[1][0]), sess.run(get_grads_and_vars[1][1])))

print('Before optimization')
print('x: {}, y: {}'.format(sess.run(x), sess.run(y)))

# optimize parameters
opt = optimizer.apply_gradients(get_grads_and_vars)
# x = x - 0.1 * dz/dx = 5 - 0.1 * 13 = 3.7
# y = y - 0.1 * dz/dy = 3 - 0.1 * 5 = 2.5
print('After optimization using learning rate 0.1')
sess.run(opt)
print('x: {:.3f}, y: {:.3f}'.format(sess.run(x), sess.run(y)))
sess.close()
image.png

在實際中,我們當然不用手動更新參數,optimizer類可以幫我們自動更新,另外還有一個函數也能夠計算梯度。

 tf.gradients(ys, xs, grad_ys=None, name='gradients', colocate_gradients_with_ops=False, gate_gradients=False, aggregation_method=None)

這個函數會返回list,list的長度就是xs的長度,list中每個元素都是
image.png

實際運用: 這個方法對于只訓練部分網絡非常有用,我們能夠使用上面的函數只對網絡中一部分參數求梯度,然后對他們進行梯度的更新。

鏈接:https://zhuanlan.zhihu.com/p/28924642

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容