一、在执行代码时使用 tf.enable_eager_execution()
开启eager模式
二、正向传播支持自定义class类型
二、反向传播的使用
先用tf的api定义loss函数
用tfe的api调用loss得到梯度grads
1
2tfe.gradients_function(loss,x)
tfe.implicit_gradients(loss)或者也可以采用GradientTape(y,x)来进行计算可以根据函数y计算变量x的梯
1
2with tf.GradientTape() as grad_tape:
grad_tape.gradient(y,x)在tf的诸多eager execution样例中里用第二种方法较多
用tf定义的optimizer优化梯度更新参数
1
optimizer.apply_gradients(grad)
三、Eager的输入使用tf.data.Dataset
但不支持placeholder
和string_input_producer
这类在graph模式中使用的输入
四、使用tf.train.Checkpoint()
保存模型的checkpoint
五、可以使用tf.contrib.eager.defun
对python的函数进行封装转换成图的形式进行运算。用eager的写法可以实现graph的运算速度。
使用了defun的forward propagation例子如下:
1
2model.call = tf.contrib.eager.defun(model.call)
model(x, training=True) # executes a graph, with dropout一个使用了defun的back propagation例子如下
1
2
3
4
5
6
7optimizer = tf.train.GradientDescentOptimizer()
with tf.GradientTape() as tape:
outputs = model(x)
gradient = tape.gradient(outputs, model.trainable_variables)
defun_gradients = tfe.defun(gradient)
tfe.defun(optimizer.apply_gradients((grad, var) for grad,
var in zip(gradient,model.trainable_variables)))
Refer:Code with Eager Execution, Run with Graphs: Optimizing Your Code with RevNet as an Example