Tensorflow学习笔记(二):Tensorflow入门操作

一、张量(tensor)

TensorFlow用张量(tensor)这种数据结构来表示所有的数据。

一阶张量来表示向量,如:v = [1.2, 2.3, 3.5]
二阶张量表示矩阵,如:m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

可以看成是方括号嵌套的层数。

二、常量(constant)

在tensorflow中,常量的定义语句为:

import tensorflow as tf
a=tf.constant(3)

这就定义了一个值为10的常量a

三、变量(Variable)

变量用Variable来定义,并且必须初始化,如:

x=tf.Variable(tf.ones([3,3]))
y=tf.Variable(tf.zeros([3,3]))

分别定义了一个3x3的全1矩阵x,和一个3x3的全0矩阵y,0和1的值就是初始化。

变量定义完后,还必须显式的执行一下初始化操作,即需要在后面加上一句:

init=tf.global_variables_initializer()

不加这句,可能会报错。

四、占位符(placeholder)

变量在定义时要初始化,但是如果有些变量刚开始我们并不知道它们的值,无法初始化,那怎么办呢?

那就用占位符来占个位置,如:

扫描二维码关注公众号,回复: 8908121 查看本文章
x = tf.placeholder(tf.float32, [None, 784])

指定这个变量的类型和shape,以后再用feed的方式来输入值。

五、图(Graph)

如果把下面的python语句改在tf语句,该怎么写呢:

x=3
y=2
z=x+y
print(z)

定义两个变量,并将两个数相加,输出结果。如果在tf中直接像上面这样写,那就错了。x,y,z分别是三个tensor对象,对象间的运算称之为操作(op), tf不会去一条条地执行各个操作,而是把所有的操作都放入到一个图(graph)中,图中的每一个结点就是一个操作。然后行将整个graph 的计算过程交给一个 TensorFlow 的Session, 此 Session 可以运行整个计算过程,比起操作(operations)一条一条的执行效率高的多。

执行代码如下:

import tensorflow as tf

x = tf.Variable(3)
y = tf.Variable(5)
z=x+y
init =tf.global_variables_initializer()
with tf.Session() as sess: 
    sess.run(init) 
    print(sess.run(z))

其中sess.run()即是执行,注意要先执行变量初始化操作,再执行运算操作。

Session需要先创建,使用完后还需要释放。因此我们使用with…as…语句,让系统自动释放。

五、编写Tensorflow程序

实际上编写tensorflow可以总结为两步.

1)组装一个graph;2)使用session去执行graph中的operation。
 因此我们从 graph 与 session 说起。

1、graph和session

(1)、概念说明

下面是 graph , session , operation , tensor 四个概念的简介。

Tensor:类型化的多维数组,图的边;

Operation:执行计算的单元,图的节点;

Graph:一张有边与点的图,其表示了需要进行计算的任务;

Session:称之为会话的上下文,用于执行图。

Graph仅仅定义了所有 operation 与 tensor 流向,没有进行任何计算。而session根据 graph 的定义分配资源,计算 operation,得出结果。既然是图就会有点与边,在图计算中 operation 就是点而 tensor 就是边。Operation 可以是加减乘除等数学运算,也可以是各种各样的优化算法。每个 operation 都会有零个或多个输入,零个或多个输出。 tensor 就是其输入与输出,其可以表示一维二维多维向量或者常量。而且除了Variables指向的 tensor 外所有的 tensor 在流入下一个节点后都不再保存。

(2)、计算图

Tensorflow 是基于计算图的框架,因此理解 graph 与 session 显得尤为重要。不过在讲解 graph 与 session 之前首先介绍下什么是计算图。假设我们有这样一个需要计算的表达式。该表达式包括了两个加法与一个乘法,为了更好讲述引入中间变量c与d。由此该表达式可以表示为:
在这里插入图片描述

当需要计算e时就需要计算c与d,而计算c就需要计算a与b,计算d需要计算b。这样就形成了依赖关系。这种有向无环图就叫做计算图,因为对于图中的每一个节点其微分都很容易得出,因此应用链式法则求得一个复杂的表达式的导数就成为可能,所以它会应用在类似tensorflow这种需要应用反向传播算法的框架中。

(3)、程序实现a=(b+c)∗(c+2)a=(b+c)∗(c+2)

1、定义数据

import tensorflow as tf
# 首先,创建一个TensorFlow常量=>2
const = tf.constant(2.0, name='const')
# 创建TensorFlow变量b和c
b = tf.Variable(2.0, name='b')
c = tf.Variable(1.0, dtype=tf.float32, name='c')

如上,TensorFlow中,使用tf.constant()定义常量,使用tf.Variable()定义变量。Tensorflow可以自动进行数据类型检测,比如:赋值2.0就默认为tf.float32,但最好还是显式地定义。更多关于TensorFlow数据类型的介绍查看官方文档。

2、定义计算

# 创建operation
d = tf.add(b, c, name='d')
e = tf.add(c, const, name='e')
a = tf.multiply(d, e, name='a')

发现了没,在TensorFlow中,+−×÷+−×÷都有其特殊的函数表示。实际上,TensorFlow定义了足够多的函数来表示所有的数学运算,当然也对部分数学运算进行了运算符重载,但保险起见,我还是建议你使用函数代替运算符。

**!!TensorFlow中所有的变量必须经过初始化才能使用,**初始化方式分两步:

1、定义初始化operation
2、运行初始化operation

# 1. 定义init operation
init_op = tf.global_variables_initializer()

以上已经完成TensorFlow graph的搭建,下一步即计算并输出。

运行graph需要先调用tf.Session()函数创建一个会话(session)。session就是我们与graph交互的handle。更多关于session的介绍见官方文档。

# session
with tf.Session() as sess:
	# 2. 运行init operation
	sess.run(init_op)
	# 计算
	a_out = sess.run(a)
	print("Variable a is {}".format(a_out))

在学习的过程中借鉴了一些大佬的博客,下面放出参考链接。

参考文献

1、https://blog.csdn.net/hustqb/article/details/80222055
2、https://blog.csdn.net/m0_37167788/article/details/79024541

发布了38 篇原创文章 · 获赞 46 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/sk18192449347/article/details/100111122