Getting Started With TensorFlow

此为TensorFlow框架官网学习笔记,原文为Getting Started With TensorFlow

The Computational Graph

tensorflow的核心程序由下面两个分离的部分组成

  1. Building the computational graph.
  2. Running the computational graph.

Tensorflow中的常量(constant)没有输入,输出一个内部存储的值,如下创建两个float类型的张量node1,node2如下:

1
2
3
node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
print(node1, node2)

输出的结果如下:

1
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)

如上,并没有输出值3.0和4.0,如果要输出结果,需要使用session,如下,创建Session,然后输出节点值:

1
2
sess = tf.Session()
print(sess.run([node1, node2]))

1
[3.0, 4.0]

我们也可以通过联合Tensor来做一些复杂的操作,如下作加法:

1
2
3
node3 = tf.add(node1, node2)
print("node3:", node3)
print("sess.run(node3):", sess.run(node3))

输出的结果为:

1
2
node3: Tensor("Add:0", shape=(), dtype=float32)
sess.run(node3): 7.0

TensorBoard中显示如下


graph也可以被初始化接收一个外部输入,作为占位符(placeholder),表示随后提供一个值,如下:
1
2
3
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + provides a shortcut for tf.add(a, b)

在run中提供a和b的值

1
2
print(sess.run(adder_node, {a: 3, b: 4.5}))
print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))

结果如下

1
2
7.5
[ 3. 7.]

同时也会提供变量(Variable)来修改参数,变量的定义如下W和b

1
2
3
4
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b

Variable和constant的区别:constant可以被初始化,通过使用tf.constant,但初始化后的值不能被修改,而变量不能通过tf.Variable来初始化,初始化需要用统一的Tensorflow程序,如下:

1
2
init = tf.global_variables_initializer()
sess.run(init)

变量通过assign来修改,如下,将W和b修改为-1和1,修改语句也需要在run中执行才能生效:

1
2
3
fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])

tf.train API

梯度下降
TensorFlow提供一个优化的方法,可以通过缓慢的修改变量来使得损失函数最小化,如下使用梯度下降来优化损失函数,这里在for循环中run了1000次,其中的train就执行了1000次,每次执行后都会修改W和b的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
optimizer = tf.train.GradientDescentOptimizer(0.01)#学习率
train = optimizer.minimize(loss)
sess.run(init) # reset values to incorrect defaults.
for i in range(1000):
sess.run(train, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]})
print(sess.run([W, b]))

结果为:

1
[array([-0.9999969], dtype=float32), array([ 0.99999082], dtype=float32)]

评估函数
tf.estimator简化了机器学习的机制,包括运行训练模型,评估模型,管理数据集
定义如下模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def model_fn(features, labels, mode):
W = tf.get_variable("W", [1], dtype=tf.float64)#用来创建或者获取变量
b = tf.get_variable("b", [1], dtype=tf.float64)
y = W*features['x'] + b
loss = tf.reduce_sum(tf.square(y - labels))#损失函数
global_step = tf.train.get_global_step()#训练步数
optimizer = tf.train.GradientDescentOptimizer(0.01)#梯度下降
train = tf.group(optimizer.minimize(loss),
tf.assign_add(global_step, 1))#优化损失函数,将迭代次数加1
return tf.estimator.EstimatorSpec(
mode=mode,
predictions=y,
loss=loss,
train_op=train)

训练数据及评估器:

1
2
3
4
5
6
estimator = tf.estimator.Estimator(model_fn=model_fn)
# define our data sets
x_train = np.array([1., 2., 3., 4.])
y_train = np.array([0., -1., -2., -3.])
x_eval = np.array([2., 5., 8., 1.])
y_eval = np.array([-1.01, -4.1, -7., 0.])

这里用训练数据训练模型,然后用训练数据和测试数据评估模型
需要注意的是,这里的num_epochs如果有指定,表示每个元素产生num_epochs次,否则循环产生;shuffle表示是否打乱顺序,shuffle=False表示按顺序存储num_epochs次,否则乱序存储num_epochs次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)
train_input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_train}, y_train, batch_size=4, num_epochs=1000, shuffle=False)
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_eval}, y_eval, batch_size=4, num_epochs=1000, shuffle=False)
# We can invoke 1000 training steps by invoking the method and passing the
# training data set.
estimator.train(input_fn=input_fn, steps=1000)
# Here we evaluate how well our model did.
train_metrics = estimator.evaluate(input_fn=train_input_fn)
eval_metrics = estimator.evaluate(input_fn=eval_input_fn)
print("train metrics: %r"% train_metrics)
print("eval metrics: %r"% eval_metrics)

结果如下:

1
2
train metrics: {'loss': 1.227995e-11, 'global_step': 1000}
eval metrics: {'loss': 0.01010036, 'global_step': 1000}

如果觉得有帮助,给我打赏吧!