9

tensorflow(一):基础

 3 years ago
source link: http://www.cnblogs.com/zhangxianrong/p/13764234.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、张量

1、张量的概念

在TensorFlow中,所有的数据都通过张量的形式来表示。 从功能的角度,张量可以简单理解为多维数组,零阶张量表示标量(scalar),也就是一个数;一阶张量为向量(vector),也就是一维数组;n阶张量可以理解为一个n维数组。需要注意的是,张量并没有真正保存数字,它保存的是 计算过程

2、张量的属性

以张量 Tensor("Add:0", shape=(), dtype=float32) 为例:

(1)名字(Name)

属性的第一项就是名字,一般形式为“node:src_output”,node表示节点名称,src_output 来自节点的第几个输出。

(2)形状(Shape)

属性的第二项是维度,张量的维度可以用三个术语来描述:阶(Rank)、形状(Shape)、维数(Dimension Number)。一般表示形式如表1所示。

形状

维数

例子

0

()

0-D

4

1

(D0)

1-D

[2,3,5]

2

(D0,D1)

2-D

[[2,3],[3,4]]

3

(D0,D1,D2)

3-D

[[[7],[3]],[[2],[4]]]

N

(D0,D1,…,Dn-1)

N-D

形为(D0,D1,…,Dn-1)的张量

表3-1 张量的维度表示

(3)类型(Type)

每一个张量会有一个唯一的类型,TensorFlow在进行运算的时候会对参与运算的所有张量进行类型的检查,发现类型不匹配时会报错.

TensorFlow支持14种不同的类型:

实数 tf.float32, tf.float64

整数 tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8

布尔 tf.bool

复数 tf.complex64, tf.complex128

默认类型:不带小数点的数会被默认为int32,带小数点的会被默认为float32。

二、常量与变量

1、常量 Constant

常量指在运行过程中不会改变的值,在TensorFlow中无需进行初始化操作。

创建语句:

Constant_name = tf.constant(value)

常量在TensorFlow中一般被用于设置训练步数、训练步长和训练轮数等超参数,此类参数在程序执行过程中一般不需要被改变,所以一般被设置为常量。

2、变量 Variable

变量是指在运行过程中会改变的值,在TensorFlow中需要进行初始化操作。

创建语句:

name_variable = tf.Variable(value, name)

注意:V是大写字母

个别变量初始化:

init_op = name_variable.initializer()

使用TensorFlow编写一个简单的神经网络一般会用到几十个变量,若编写大型的神经网络,往往会使用到成千上万个变量。若每个变量定义完都要初始化未免太过繁琐,所以TensorFlow有提供所有变量初始化的语句。 所有变量初始化:

init_op = tf.global_variables_initializer()

# 一个简单计算图
node1 = tf.constant(3.0,tf.float32,name="node1")
node2 = tf.constant(4.0,tf.float32,name="node2")
node3 = tf.add(node1, node2)
print(node3)
​
# 建立对话并显示运行结果
sess = tf.Session()
​
print("运行sess.run(node1)的结果:", sess.run(node1))
# 更新变量并返回计算结果
print("运行sess.run(node3)的结果:", sess.run(node3))
​
# 关闭session
sess.close()

三、会话

# 定义计算图
tens1 = tf.constant([1,2,3])
​
# 创建一个会话
sess = tf.Session()
try:
#使用这个创建好的会话来得到关心的运算的结果。比如可以调用 sess.run(result)
#来得到张量result的取值
    print(sess.run(tens1))
except:
    print("Exception!")
finally:
#关闭会话使得本次运行中使用到的资源可以被释放
    sess.close()
node1 = tf.constant(3.0,tf.float32,name="node1")
node2 = tf.constant(4.0,tf.float32,name="node2")
result = tf.add(node1, node2)
​
#创建一个会话,并通过Python中的上下文管理器来管理这个会话
with tf.Session() as sess:
    #使用这创建好的会话来计算关心的结果
    print(sess.run(result))
​
# 不需要再调用 Session.close() 函数来关闭会话
# 当上下文退出时会话关闭和资源释放也自动完成了

四、变量的赋值

与传统的编程不同,在TensorFlow中变量定义和初始化后,一般无需人工进行赋值,系统会根据算法模型,训练优化过程中 自动调整变量对应的数值 。这部分的内容在后面我们使用TensorFlow实现机器学习的一些算法的时候会更加有体会。

TensorFlow中的变量可以通过设置trainable参数来确定在训练的时候是否更新其值,如前面提到训练轮数一般设置为常量,但如果设置为变量,可以设置trainable=False,同样可以达到程序执行过程中不改变其值的目的。前面提到的训练轮数可以用以下语句进行变量赋值:

epoch = tf.Variable(0,name='epoch', trainable=False )。

但是当TensorFlow中有特殊情况需要对变量进行人工更新,也是可以用变量的更新语句的,例如:

update_op = tf.assign(variable_to_be_updated, new_value)。

import tensorflow as tf
​
value = tf.Variable(0, name="value")
one = tf.constant(1)
new_value = tf.add(value, one)
update_value = tf.assign(value, new_value)
​
init = tf.global_variables_initializer()
​
with tf.Session() as sess:
    sess.run(init)
    for _ in range(10):
        sess.run(update_value)
        print(sess.run(value))

五、占位符

前文提到,TensorFlow中的Variable变量类型,在定义时需要初始化,但有些变量定义时并不知道其数值,只有当真正开始运行程序时,才由外部输入,比如训练数据,这时候需要用到 占位符

占位符,是TensorFlow中特有的一种数据结构,类似动态变量,函数的参数、或者C语言或者Python语言中格式化输出时的“%”占位符。

TensorFlow中的占位符虽然定义完之后不需要对其值进行初始化,但是需要确定其数据的Type和Shape。占位符的函数接口如下:

tf.placeholder(dtype, shape=None, name=None)

1、Feed提交数据

在TensorFlow中如果构建了一个包含placeholder操作的计算图,在程序执行当在session中调用run方法时,placeholder占用的变量必须通过 feed_dict 参数传递进去,否则报错。图12提供了一个Feed的样例。

IrM7ZrF.png!mobile     注 :多个操作可以通过一次Feed完成执行

2、 Fetch提取数据

会话运行完成之后,如果我们想查看会话运行的结果,就需要使用fetch来实现,feed、fetch一般搭配起来使用

import tensorflow as tf
a = tf.placeholder(tf.float32, name='a')
b = tf.placeholder(tf.float32, name='b')
c = tf.multiply(a, b, name='c')

init = tf.global_variables_initializer()

with tf.Session() as sess:
#    sess.run(init)
    # 通过feed_dict的参数传值,按字典格式
    result = sess.run(c, feed_dict={a:10.0, b:3.5})
    
print(result)
import tensorflow as tf
a = tf.placeholder(tf.float32, name='a')
b = tf.placeholder(tf.float32, name='b')
c = tf.multiply(a, b, name='c')
d = tf.subtract(a, b, name='d')
with tf.Session() as sess:
    #返回的两个值分别赋给两个变量
    rc,rd = sess.run([c,d], feed_dict={a:[8.0,2.0,3.5], b:[1.5,2.0,4.]})  
    print("value of c=",rc,"value of d=",rd)

六、tensorboard可视化

1、 在TensorBoard中查看图结构

EBrUJfa.png!mobile

图3-15 在TensorBoard中查看图结构

上图代码中的Logdir指定的目录为运行后产生日志文件的目录,如图16所示我们可以打开文件管理器进行查看。

Nr2MRnU.png!mobile

图 3-16 日志目录

2、启动TensorBoard

TensorBoard不需要额外安装,在TensorFlow安装时已自动完成,在Anaconda Prompt中先进入日志存放的目录( 注:非常重要 ),再运行TensorBoard,并将日志的地址指向程序日志输出的地址。

命令:tensorboard --logdir=/path/log (/path/log为产生日志文件的目录)

启动服务的端口默认为6006;使用 --port 参数可以改编启动服务的端口。

TensorBoard是一个在本地启动的服务,启动完成后在浏览器网址: http://localhost:6006 即可进行访问。

3、TensorBoard常用API

API

描述

tf.summary.FileWrite()

创建FileWriter和事件文件,会在logdir中创建一个新的事件文件

tf.summary.FileWriter.add_summary()

将摘要添加到事件文件

tf.summary.FileWriter.add_event()

向事件文件添加一个事件

tf.summary.FileWriter.add_graph()

向事件文件添加一个图

tf.summary.FileWriter.get_logdir()

获取事件文件的路径

tf.summary.FileWriter.flush()

将所有事件都写入磁盘

tf.summary.FileWriter.close()

将事件写入磁盘,并关闭文件操作符

tf.summary.scalar()

输出包含单个标量值的摘要

tf.summary.histogram()

输出包含直方图的摘要

tf.summary.audio()

输出包含音频的摘要

tf.summary.image()

输出包含图片的摘要

tf.summary.merge()

合并摘要,包含所有输入摘要的值

表3-2 TensorBoard常用API

import tensorflow as tf
#清除default graph和不断增加的节点
tf.reset_default_graph() 

# logdir改为自己机器上的合适路径
logdir='D:/log'

#定义一个简单的计算图,实现向量加法的操作
input1 = tf.constant([1.0, 2.0, 3.0], name="input1")
input2 = tf.Variable(tf.random_uniform([3]), name="input2")
output = tf.add_n([input1, input2], name="add")

#生成一个写日志的writer,并将当前的TensorFlow计算图写入日志。
writer = tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK