使用Tensorflow的基本套路是,先建立一个问题的模型,然后求解模型的参数。 建立模型要涉及到占位符(Placeholder)和变量(Variable),求解模型参数涉及优化器。 因此,只要理解了这三个概念,我们便可以使用Tensorflow构建自己的模型并求解模型的参数。
占位符(Placeholder)
使用 tf.placeholder 来创建一个占位符,创建时需要指定它的类型。 比如我们要建立一个数学公式 2x2 + 3x + 1,此时就需要将x定义为一个占位符。这样我们才能在求解公式的值时,动态地指定x的值。
import tensorflow as tf
x = tf.placeholder(tf.int32) 1
y = 2*x*x + 3*x + 1 2
sess = tf.Session()
r = sess.run(y, feed_dict={x:2}) 3
- 1 :创建一个占位符,其类型为int32
- 2 :定义数学公式。其中自变量为x,函数值为y
-
3 :求解给定自变量x为2时,函数值y的值。通过
feed_dict
参数指定一个占位符的值。 运行过后,r的值为15(2*22 + 3*2 + 1)
占位符有点像编程语言中变量的概念,但关键不同为:占位符不会保存值,当指定一个值给它后,它并不会将这个值保存起来,以便下次使用。而是你每次使用它时,都必须为它指定一个新值。而变量则会将上次的值一直保存,下次使用时你不必再指定新值,它会直接使用上次保存的值。
一个数学公式中的自变量正好需要这样:它本身没有状态(即不会保存上次的值),你每次求解公式的值时,都必须指定自变量的值。所以,占位符的作用为:
占位符提供了一种给模型指定自变量值的机制
一个基本规则为,在使用Tensorflow建模时,将模型的自变量和因变量定义为占位符,这就对了。
如果一个模型中包含了占位符,则在求解这个模型值时,Tensorflow会强制必须指定所有占位符的值,通过 feed_dict
。如上面例子所示,在求解y时,必须指定x的值。
如果没有指定x的值,如下所示:
r = sess.run(y)
则会报一个错误:
You must feed a value for placeholder tensor \'Placeholder\' with dtype
关于 feed_dict
参数
这个参数指定所有占位符的值。为一个dict。每个key指定的一个占位符的值。key值为占位符本身,如例子中的x,对应的值为占位符的值。
当模型中包含占位符时,则在求解模型值时,必须使用 feed_dict
来指定所有占位符的值。
关于 sess.run
这个函数用于求解一个结点的值。
变量(Variable)
使用tf.Variable创建一个变量。变量跟编程语言中的变量的概念非常相似,表示一个存储空间,能够保存一个值。变量在使用必须有一个初始值,你可以改变一个变量的值。
使用Tensoflow创建机器学习模型时,变量被用于表示模型的参数。一般来说,训练机器学习模型的过程,就是寻找模型参数的过程。在训练开始前,都会给参数一个初始值,然后逐渐修改变量的值,使得模型能够逼近训练数据。
以下是使用变量的一个例子。
a = tf.Variable(3, name='my_a')
b = tf.constant(3)
c = a*b
# a variable must be initilized
init = tf.global_variables_initializer()
self.sess.run(init)
r = self.sess.run(c) # r=9
变量在使用必须被初始化,通过调用 tf.globalvariablesinitializer() 来实现。如果没有初始化,则会报下面的错误。
Attempting to use uninitialized value my_a
修改变量的值
通过变量的 assign 函数来修改它的值。如下所示。
a = tf.Variable(3, name='my_a')
init = tf.global_variables_initializer()
sess.run(init)
assert(sess.run(a) == 3)
assign_to_4 = a.assign(4)
# Before run the operation, a is still 3. This is a little hard to understand
assert(sess.run(a) == 3)
r = sess.run(assign_to_4)
assert(sess.run(a) == 4)
但在训练机器学习模型时,并不需要自己修改变量的值,优化器会自动修改。
优化器(Optimizer)
当使用占位符和变量构造好模型及目标函数后,便可使用优化来求解模型的参数。使用占位符表示模型的自变量和因变量(即模型的X,Y),使用变量表示模型的参数。
总结
使用Tenforflow建模时,将模型的自变量和因变量定义为占位符(Placeholder),这样我们可以动态地指定自变量和因变量的值。
将模型的参数指定为变量(Variable),并给定一个初值,这样Tensorflow在求解模型参数过程中,其可以不断修改参数的值,直到模型能够和数据点吻合。
优化器是Tensorflow求解模型的工具,梯度下降是一种常用的优化器。