【tensorflow基础学习】张量

张量—tensorflow的数据模型

        从tensorflow的命名中可以看出,tensor(张量)在整个框架体系中都是一个重要的概念。如果将计算图称为tensorflow的计算模型,那么张量则可以对应地称为tensorflow的数据类型,因为张量是tensorflow管理数据的形式。换句话说,在tensorflow中,所有的数据都可以借助张量的形式来表示。

概念

        张量,可以简单地理解为不同维度的数组。其中零阶张量的表示形式是标量(Scaler),也就是一个数;一阶张量的表示形式是向量(Vector),也就是一维数组;二阶张量的表示形式是一个二维数组;以此类推,n阶张量可以理解为是n维数组。

       尽管可以这样理解,但是要记住,张量只是引用了程序中的运算结果而不是一个真正的数组。张量保存的是运算结果的属性,而不是真正的数字。这可以用一个向量相加的例子进行说明。如下面这段代码:

a = tf.constant([1.0, 2.0], name = 'a')
b = tf.constant([3.0, 4.0], name = 'b')
result = a + b
print(result)
#Tensor("add:0", shape=(2,), dtype=float32)

用print打印result,并没有得到理想中的加法运算结果[4. 6.],而是得到了一个张量表示“#Tensor("add:0", shape=(2,), dtype=float32)”。这说明result是一个张量,主要保存了加法运算结果的3个属性:操作(op)、维度(shape)和数据类型(dtype)。

对于任意一个张量来说,都具备这3个属性。也可以尝试使用print()函数打印a或b,这样会输出张量a和b的属性信息。接下来,对这3个属性进行介绍。

(1)操作:它可以被看作是一个张量的名字,或者作为一个张量的唯一标识符。操作的命名具有一定的规则,这和计算图中的节点有关。计算图中的每一个节点都表示一个运算,而张量则将节点运算结果的属性保存了下来。操作的命名符合“node:src_output”的形式,其中node就是节点的名称,src_output表示这个张量是节点的第几个输出(编号从0开始)。

(2)维度:这个属性描述了一个张量的维度信息。维度是一个张量的非常重要的属性。Tensorflow提供了很多API函数用来修改数据的维度,比如函数resize_image()和reshape()。

(3)数据类型:每一个张量的数据类型都是唯一的。Tensorflow会检查所有参与某个运算的张量的数据类型,当发现类型不匹配是就会报错,举个例子说明,如下述代码:

a = tf.constant([1, 2], name='a')
b = tf.constant([3.0, 4.0], name='b')
result = a + b

这个程序中由于参与加法运算的a和b数据类型不一致(a的数据类型是整数,b的数据类型是实数)会导致错误(类型不匹配的错误)的发生。报错的信息可能会是下面的这段:

Tensorflow支持14种不同的数据类型,大体上可分为4类:整数型(tf.int8, tf.int16, tf.int32, tf.int64, uint8),实数型(tf.float32, tf.float64),布尔型(tf.bool),复数型(tf.complex64, tf.complex128)。在声明变量或常量时,可以用dtype参数直接指定其数据类型;如果不指定类型,tensorflow会给出默认的类型;如不带小数点的数会被默认为int32,带小数点的数会被默认为float32。使用默认类型是会导致潜在的类型不匹配问题,所以一般建议通过指定dtype参数来指明变量或者常量的数据类型。

使用张量

张量没有特殊的使用规则,对它的使用几乎渗透到了程序的每一个角落。比如,在向量相加的样例中定义a和b时,a和b就作为张量而出现在了程序中。也可以不去定义a和b而直接定义result作为两个constant结果的加和,但这样显然会增加代码的长度并降低可读性。

当计算图构造完成之后,我们也可以在程序运行的时候使用张量来查看计算的结果(也就是真实的数字)。这需要我们定义会话(session),在调用会话的run()函数时将想要得到的真实数字的张量传递进去。下面这段代码展示了这个过程:

a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([3.0, 4.0], name='b')
c = a + b
#定义会话
with tf.Session() as sess:
    tf.initialize_all_variables()
    print(sess.run(c))
#输出[4. 6.]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值