本博文是根据TensorFlow最新(r1.0)官方文档编写的,自己对上面的教程整理了一下,根据自己的理解写的。
本人看过TensrFlow(0.5)的官方文档。因此,我不会把全部教程都写上来,主要写和之前不同的,或者我没看过的。
https://www.tensorflow.org/get_started/get_started
使用TensorFlow Python API 编程入门
TensorFlow Core指南
一、导入TensorFlow
典型的导入TensorFlow程序的做法如下:
运行这个,可以得到Python下的TensorFlow中的所有类、方法和符号。大多数的文档默认你已经执行了这个。
二、计算图 (Computational Graph)
TensorFlow Core程序是由两个分离的部分组成的:
1、构建计算图。
2、运行计算图。
一个计算图是一系列TensorFlow操作的点(nodes)。我们构建一个简单的计算图。每一个点需要零个或者更多的张量(tensor)作为输入,并且产生一个张量作为输出。
2.1 常量(Constant)
点的一种形式是常数。像所有TensorFlow常数,它不需要输入,而它会从内部输出一个值。我们可以创建两个点的张量node1和node2,如下所示:
注意到,它输出的并不是3.0和4.0的值,而是对应的点张量,要通过开启会话,才能直接输出其值。这直接反映了TensorFlow的构建和计算是分离的。
2.2 会话
接下来的代码就是创建一个Session对象,调用它的run方法。只有这样,才能进行真正的运算。如下所示:
这时,我们就能得到了想象中的两个值。
我们可以通过联合多个张量(Tensors),构建更为复杂的运算。例如,我们可以进行点张量的相加,如下所示:
2.3 占位符(Placeholder)
有些时候,我们不会直接使用常量进行计算,而需要事先创建一个量去表示运算。这时,在TensorFlow中可以采用placeholders的方法。它的本质就是一个占位符,先用placeholder表示进行运算的表达,程序后面在进行“喂值”(feed_dict)。如下所示:
由上面操作可见,a和b都没有固定的值,它们创建的目的只是为了表示相加这种运算。
如果程序后面需要用到这种运算,我们可以使用feed_dict进行喂值。
显然,不同的“喂值”,得出的结果可能也不同。
在基础上,我们可以进行更复杂的操作。我们可以对adder_node进行相乘操作。如下所示:
当然,要显示最终结果,需要进行回话和喂值。
2.4 变量(Variable)
机器学习中,我们构建模型,TensorFlow中模型有输入有输出,训练中参数会不断更新,这时,我们需要创建变量(Variable)。TensorFlow中,Variable可以将训练参数添加到图中,声明变量时,一般需要声明变量的类型(如:tf.float32)和赋初值。如下所示:
这样,我们就成功地创建了变量。从上面例子,我们可以看出placeholder和Variable的区别。当该量是通过训练更新的,我们可以通过Variable创建,当该量是作为模型的输入,我们可以通过placeholder创建。
当然,变量的启动不仅需要开启会话,还要在会话中进行初始化。
这样,变量才真正地被初始化。
2.5 基本模型的训练优化
初始化成功,我们给模型喂值,
其实,这里我们构建了一个很简单的线性模型。我们希望该模型能够进行训练优化,然而,我们没有设定训练集的期望值。因此,我们自定义期望值。
优化训练,我们采用最小二乘法。
代价函数为:cost(x) = sum(linear_model(x) - y)/number of trainset
我们得出了训练一次的代价值。通过观察训练数据(即x和y的取值),我们可以发现,当W取-1,b取1的时候,模型代价最小,为0。
显然,-1和1是我们观察出来的最优解。我们怎么通过优化方法,最小化代价函数呢?答案:使用TensorFlow自带的优化函数api,进行大量的迭代和参数的更新,最小化代价。
通过1000次的迭代训练,最终得到了理想的参数值。
三、整合
# -*- coding:utf-8 -*-
import tensorflow as tf
import numpy as np
# Model paramters
W = tf.Variable([.3],tf.float32)
b = tf.Variable([1.],tf.float32)
# Model io
x = tf.placeholder(tf.float32)
linear_model = W*x+b
y = tf.placeholder(tf.float32)
# cost function
cost = tf.reduce_sum(tf.square(linear_model-y))
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(cost)
# trianing data
x_train = [1.,2.,3.,4.]
y_train = [0.,-1.,-2.,-3.]
# training loop
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(1000):
sess.run(train,{x:x_train,y:y_train})
if i%100==0:
cc = sess.run(cost,{x:x_train,y:y_train})
print("training step(%s), cost: %s"%(i,cc))
# Evaluate training accuracy
curr_W,curr_b,currr_cost = sess.run([W,b,cost],{x:x_train,y:y_train})
print("W: %s,b: %s,cost: %s"%(curr_W,curr_b,currr_cost))
实验结果: