Tensorlow: Eager execution

1 定义

用于数值计算,支持GPU加速,类似Numpy的库;能够自动微分,用于机器学习研究和试验,是一个较灵活的平台。

2 优势

  • 与python debugging工具兼容,可以很方便的进行调试
  • 提供了中间出错日志提示
  • 允许使用python数据结构
  • 很容易执行,并且是python风格的控制流

使用Eager,你不用再担心关于:placeholders,sessions,control dependencies,“lazy loading”,name或者variabel scopes等问题。

3 example

接下来,我们来对比用eager执行的代码到底有多简洁,如下是基于graphs图定义,sesseion执行的一个例子:

import tensorflow as tf

def example():
	x = tf.placeholder(tf.float32, shape=[1,1])
	m = tf.matmul(x,x)
	print(m)
	with tf.Session() as sess:
		m_out = sess.run(m, feed_dict={
    
    x: [[2.]]})
	print(m_out)

结果为[[4.]],我们可以看出,执行一个简单的平方数,需要placeholder定义,session执行,run出结果,才可以看到得到结果,第一个print语句,没run之前,是看不到结果的。
那么我们来看下上面的功能,用eager执行怎么实现,如下代码所示:

import tensorflow  as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()

def example():
	x = [[2.]]
	m = tf.matmul(x,x)
	print(m)
if __name__=='__main__':
	example()

代码简洁了很多,不再需要定义placeholder,session run出结果等。

3.1 Gradients

自动求解微分以及集成到eager的执行器里了,让我们简单测试一个例子,看eager执行器怎么求解梯度:

# -*-coding:utf8 -*-
import tensorflow as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
import sys

def loss(x,y):
	return (y - x**2)**2

def gradients():
	x = tfe.Variable(2.0)
	grad = tfe.implicit_gradients(loss)
	print(loss(x,7.))
	print(grad(x,7.))

if __name__=='__main__':
	gradients()

运行结果为:
tf.Tensor(9.0, shape=(), dtype=float32) (loss值)
[(<tf.Tensor: id=59, shape=(), dtype=float32, numpy=-24.0>, <tf.Variable ‘Variable:0’ shape=() dtype=float32, numpy=2.0>)] (梯度值)

4 选择eager的理由

  • 如果想要更加灵活的框架,能够在试验中使用python控制流和数据结构,那么eager是个不错的选择
  • 开发一个新的模型,debug的时候可以方便的打印中间错误日志信息,那么eager是个不错的选择
  • 如果你是一个新入门tensorflow,选择eager,让你可以使用python去探索更多的TF API,在tensorflow 2.0中,默认使用eager执行器。

猜你喜欢

转载自blog.csdn.net/BGoodHabit/article/details/109174293