tensorflow(一):基础

一、张量

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的样例。

tensorflow(一):基础_第1张图片     注:多个操作可以通过一次Feed完成执行

    2、 Fetch提取数据

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

你可能感兴趣的:(tensorflow(一):基础)