[TensorFlow] TensorFlow Get Started (1)

  本篇博客主要参考TensorFlow官网上的Get Started文档Get Started

Tensors

  在TensorFlow中,数据的主要单元称为tensortensor将一组原始值封装成一个任意维数的阵列。tensor的rank是它的维数。

3 # rank为0的tensor,是一个大小为[]的标量
[1., 2., 3.] # rank为1的tensor,是一个大小为[3]的向量
[[1., 2., 3.], [4., 5., 6.]] # rank为2的tensor,是一个大小为[2,3]的矩阵
[[[1., 2., 3.]], [[7., 8., 9.]]] # rank为3的tensor,是一个大小为[2,1,3]的tensor

import tensorflow

  在python中使用tensorflow,首先需要import tensorflow包。本文默认所有的程序都首先import了tensorflow包。

import tensorflow as tf

Computational Graph

  tensorflow将所有的计算流程描述为计算图(Computational Graph)。计算图由一个一个节点(node)组成,每个节点可以把一个或多个tensor作为输入,并将一个tensor作为输出。

 Constant

  常量(constant)是节点的一种,不需要输入,输出是它存储的数值。

node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0) # tf.float32是默认的
print(node1, node2)

  最终的输出为:

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

  注意这里的输出不是通常预期的值3.0和4.0。因为我们实际上输出的是描述计算图的节点,我们并没有计算该节点。

 Session

  要真实地计算节点,我们需要通过session跑一下计算图。一个session封装了TensorFlow运行时的控制和状态。以下的代码创建了一个Session,并通过调用它的run函数去计算node1和node2。

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

  我们可以得到结果:

[3.0, 4.0]

 Combining Nodes

  我们可以通过将各个节点组织起来形成一个更为复杂的计算图。比如我们可以把两个常量相加:

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

  得到结果:

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

  以上的计算图可以通过一张图直观地表示。该图可以使用TensorFlow提供的TensorBoard工具得到。

Computational Graph
图1 Computational Graph

 Placeholder

  只有常量,那数据的表现能力就太弱了。很多时候我们希望程序能更加通用,比如我们写了一个加法,我们希望它的输入可以是任意的两个数,而不是固定的两个常量。placeholder是占位符,表示程序保证在这个位置,之后会提供一个值。

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + 是tf.add(a, b)的简写

  这三行程序很像我们定义了一个lambda函数,在lambda函数中,我们定义了两个输入参数a和b,以及关于它们的一个操作。我们可以通过为这些占位符提供具体的Tensors来计算这个计算图:

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

  得到结果:

7.5
[3. 7.]

Computational Graph
图2 Computational Graph

  我们可以让这个计算图更复杂一点:

add_and_triple = adder_node * 3
print(sess.run(add_and_triple, {a:3, b:4.5}))

  得到结果:

22.5

Computational Graph
图3 Computational Graph

 Variables

  在机器学习中,我们通常需要一个可以接受任意输入的模型,例如上面的模型。 为了使模型可训练,我们需要能够修改计算图以获得新输出。variables允许我们向图中添加可训练的参数。

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

  当你使用tf.constant的时候,常量(Constant)就被初始化了,并且常量的值永远不会改变。相比之下,当你调用tf.Variable的时候,变量(Variable)不会被初始化。在TensorFlow中,变量必须显示地调用如下函数进行初始化

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

  值得注意的是,init是TensorFlow子图中的一个句柄,它初始化所有的全局变量。直到我们调用sess.run,所有的变量都没有被初始化。
  由于x是一个占位符,我们可以同时对x的几个值求linear_model,如下:

print(sess.run(linear_model, {x:[1, 2, 3, 4]}))

  输出结果为:

[ 0.          0.30000001  0.60000002  0.90000004]

  我们创建了一个模型,但我们不知道它有多好。 为了在训练数据上评估模型,我们需要一个y占位符来提供所需的值,此外我们需要实现一个损失函数(loss function)。
  损失函数测量当前模型与真实数据之间的距离。我们使用线性回归的标准损失模型,即当前模型得到的值和真实数据之间之差的平方和。linear_model - y创建一个向量,其中每个元素是对应的示例的误差。 我们调用tf.square来平方这个误差。然后,我们通过tf.reduce_sum将所有平方误差求和,得到一个标量:

y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x:[1,2,3,4], y:[0,-1,-2,-3]}))

  计算得到的损失值为:

23.66

  我们可以通过将W和b的值重新赋值为-1和1的来完美地手动改进。变量的值可以通过类似tf.assign的操作来更改。例如,W = -1和b = 1是我们模型的最佳参数,我们可以相应地改变W和b:

fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])
print(sess.run(loss, {x:[1,2,3,4], y:[0,-1,-2,-3]}))

  最后得到的损失值为:

0.0

  这里我们猜到了W和b的“完美”值,但机器学习的整个要点是自动找到正确的模型参数。我们将在下一节中说明如何完成这一任务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值