TensorFlow入门

张量(tensor)

Tensorflow中的主要数据单元是张量(tensor), 一个张量包含了一组基本数据,可以是列多维数据。一个张量的"等级"(rank)就是它的维度数字。下面是一些张量例子:

3 # 等级(rank)为0的张量;它是一个标量,形态是[]
[1., 2., 3.] # 等级为1的张量;它是一个向量,形态是[3]
[[1., 2., 3.], [4., 5., 6.]] # 等级为2的张量;它是一个矩阵,形态是[2,3]
[[[1., 2., 3.]], [[7., 8., 9]]] # 等级为3的张量;它的形态是[2, 1, 3]

TensorFlow 核心教程

TensorFlow程序的最重要引用语句如下:

import tensorflow as tf

这样就是使Python能访问TensorFlow的所有类,方法, 标识等。大部分文档都假设你已经引用了。

计算图

你可能认为TensorFlow核心程序作为两个部分的组成:

  1. 构建计算图
  2. 运行计算图

计算图是一系列的TensorFlow操作,这些操作被编排到图中各节点上。先来构建一个简单的计算图, 每个节点带有0或者多个输入张量以及一个输出张量。 有一种节点类型是常量。 如所有TensorFlow常量,它没有输入,它的输出一个内部存储的值。我们可以创建两个浮点张量node1和node2如下:

node1 = tf.constant(3.0, dtype=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。 取而代之是, 它们都是节点, 取值是才会产生3.0和4.0。要实现计算节点值, 我们必须运行Session内的计算图。 一个Session包括TensorFlow的运行时控制与状态。

如下代码创建了一个Session对象, 然后调用了它的run方法取node1和node2的值。运行session中的计算图如下:

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

我们得到了期望的值3.0和4.0

[3.0, 4.0]

通过组合Tensor节点与操作, 我们可以构建更加复杂的计算。 例如, 我们可以将两常量相加, 产生的新图如下:

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

最后两打印语句输出:

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

TensorFlow提供了一个功能叫TensorBoard, 它能显示计算图的图形, 下面是一个截图显示TensorBoard是如何可视化计算图的:

如图所示, 这个图很简单,因为它仅产生一个常量结果, 一个计算图可以参数化来接收外部输入, 它就是占位量(placeholder),一个占位量(placeholder)就是约定了延迟赋值。

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + 提供了一个tf.add(a,b)的快捷方式

前面的三行有点像一个函数或者一个lambda表达式, 我们定义了两个输入(a和b)以及它们之上的一个操作。我们可以能通过多参输入来计算图值,使用feed_dict参数来填充实际值到占位量(placeholder)。

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.]

在TensorBoard中, 图形如下:

通过添加其它操作,我们可以使计算图更复杂。例如,

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

生成输出

22.5

上述的计算图在TensorBoard中显示如下:

在机器学习中, 我们通常希望模型可以接受任意输入,就是上面的那样。 为了使模型可训练性,我需要能修改计算图,在相同输入情况下,能产生不能的输出。 变量(Variable)使我们可以添加了可训练的参数到图中。我们通过初始值与类型来创建它:

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

常量是在你调用tf.constant时初始化的, 并且这个值永不改变; 相对于变量而言,在你调用tf.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占位量(placeholder)来提供一个目标值, 来写一个损失函数。

损失函数用来衡量当前模型与提供的目标值的偏差。对于一个线性模型,我采用一个标准损失模型,它是当前模型值与目标值差的平方和。 linear_model - y 创建了一个向量,它的每一个元素是相应样本的错误偏差, 我们调用tf.square来平方每一个元素。 我们使用tf.reduce_sum来将所有元素求和得到一个标量, 它就是所有样本的总错误。

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

产生的损失值为

23.66

通过重新指定W和b的值到刚好-1与1,我们可以手动改善这个损失值。 变量是通过tf.Variable来初始化值,但是我们可以使用像tf.assign这些方法来改变它。 例如, W = -1 and 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.0

我们猜到了W和b的"刚好"值, 但是机器学习的目标就是自动化地找到正确的模型参数。 我们将在下一节展示如何实现它。

tf.train API

完整的机器学习讨论并不在这个教程之内,总之, TensorFlow提供了优化器(optimizer)来慢慢改变每个变量, 以最小化损失函数。最简单的优化器(optimizer)是梯度下降(gradient descent).它根据相应的损失的导数来调整每个变量。总的来说, 手动计算这些导数既乏味又容易出错。因此, TensorFlow能通过函数tf.gradient在仅给定模型描述,自动的产生导数。简单来说, 优化器就是为完成这些,例如:

optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(init)  # 复位缺省值
for i in range(1000):
sess.run(train, {x: [1,2,3,4], y: [0, -1, -2, -3]})
print(sess.run([W, b]))

最终结果参数为:

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

现在我们就完成了一个实际的机器学习!虽然完成这样一个简单的线性回归不需要太多的TensorFlow核心代码,复杂模型,以及复杂的方法和额外更多的代码来把数据填充到你的模型中。TensorFlow为通用模式,结构,功能提供了一个高层抽象。 我们将在下一节学习如何使用这些中的部分抽象。

完整代码

完整的可训练的线性回归模型展示如下:

import tensorflow as tf

# 模型参数
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) # 损失
loss = tf.reduce_sum(tf.square(linear_model - y)) # 平方和 # 优化器
optimizer = tf.GradientDescentOptimizer(0.01)
train = optimizer.minize(loss) # 训练数据
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# 训练循环
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # 初始化为值
for i in range(1000):
sess.run(train, {x: x_train, y: y_train}) # 计算训练准确度
curr_W, curr_b, curr_loss = sess.run([w, b, loss], {x: x_train, y: y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

原文

https://www.tensorflow.org/get_started/get_started

[译]TensorFlow入门的更多相关文章

  1. TensorFlow入门(五)多层 LSTM 通俗易懂版

    欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-09 前言: 根据我本人学习 TensorFlow 实现 LSTM 的经 ...

  2. 转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

    http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @cr ...

  3. (转)TensorFlow 入门

        TensorFlow 入门 本文转自:http://www.jianshu.com/p/6766fbcd43b9 字数3303 阅读904 评论3 喜欢5 CS224d-Day 2: 在 Da ...

  4. TensorFlow 入门之手写识别(MNIST) softmax算法

    TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST flyu6 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  5. FaceRank,最有趣的 TensorFlow 入门实战项目

    FaceRank,最有趣的 TensorFlow 入门实战项目 TensorFlow 从观望到入门! https://github.com/fendouai/FaceRank 最有趣? 机器学习是不是 ...

  6. #tensorflow入门(1)

    tensorflow入门(1) 关于 TensorFlow TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操 ...

  7. TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

    TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

  8. TensorFlow入门(四) name / variable_scope 的使

    name/variable_scope 的作用 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-08 refer to: ...

  9. TensorFlow入门教程集合

    TensorFlow入门教程之0: BigPicture&极速入门 TensorFlow入门教程之1: 基本概念以及理解 TensorFlow入门教程之2: 安装和使用 TensorFlow入 ...

随机推荐

  1. maven生命周期绑定要点

    生命周期不执行任何操作,都是抱插件大腿 maven-core-3.3.9-sources.jar下META-INF/plexus/components.xml的定义了三个生命周期的插件绑定 参考:ht ...

  2. ECharts柱状图添加点击事件

    参考: https://zhuanlan.zhihu.com/p/33050579 https://blog.csdn.net/sophia_xiaoma/article/details/780559 ...

  3. Redis 系列之CentOS下Redis的安装

    前言 安装Redis需要知道自己需要哪个版本,有针对性的安装,比如如果需要redis GEO这个地理集合的特性,那么redis版本就不能低于3.2版本,由于这个特性是3.2版本才有的.另外需要注意的是 ...

  4. python heapq模块使用

    Python内置的heapq模块 Python3.4版本中heapq包含了几个有用的方法: heapq.heappush(heap,item):将item,推入heap >>> it ...

  5. dl简单模板,无pretraining过程

    layer_dimensions = [11 22 33 22 11]'; ld_size = size(layer_dimensions , 1); % what is deal [x rx dx ...

  6. 【内存泄漏】 C/C++内存泄漏及其检测工具

    对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等.Smart Po ...

  7. learning scala read from file

    scala读文件:   example: scala> import scala.io.Sourceimport scala.io.Source scala> var inputFile ...

  8. export及export default

    const a=2; const b=3; const c=function(){console.log(a+b} export a; export b; export default c; 如上文件 ...

  9. dede织梦调取一二三级栏目名及栏目下的内容列表的方法

    网站根据需要,把地区划成省-市-文章的层级结构,栏目首页需要显示的是 复制代码代码如下: {dede:channelarclist} <!--省显示--> <a href=" ...

  10. 关于iOS设备的那些事

    首先推荐一个在用的库XYQuick 地址:https://github.com/uxyheaven/XYQuick idfa: 获取方式 [ASIdentifierManager sharedMana ...