前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow 修炼之道(1)——张量(Tensor)

TensorFlow 修炼之道(1)——张量(Tensor)

作者头像
abs_zero
修改2018-05-26 14:46:44
1.6K0
修改2018-05-26 14:46:44
举报
文章被收录于专栏:AI派

张量

TensorFlow名字可以拆解为两部分:Tensor、Flow。其中,Tensor 就表示张量。

在 TensorFlow 的世界里,张量可以简单理解为多维数组。其中,零阶张量表示常量(constant),也就是一个数;一阶张量表示向量(vector),也就是一个一维数组;二阶张量表示矩阵(matrix),也就是一个二维数组;n阶张量表示n维数组。

与Python numpy中多维数组不同的是,TensorFlow 中的张量并没有真正保存数字,它保存的是如何得到这些数字的计算过程

In [1]:

代码语言:javascript
复制
import tensorflow as tfa = tf.constant([1.0, 2.0])b = tf.constant([2.0, 3.0])result = tf.add(a, b)print("a: %s" % a)print("b: %s" % b)print("result: %s" % result)
代码语言:javascript
复制
a: Tensor("Const:0", shape=(2,), dtype=float32)
b: Tensor("Const_1:0", shape=(2,), dtype=float32)
result: Tensor("Add:0", shape=(2,), dtype=float32)

tf.constant 可以创建一个张量(常量,一旦创建后数值不会改变),tf.add 可以得到两个张量相加后的结果,它们其实表示的都只是一个计算过程,并不会得到最终的结果。

直接打印出变量a、b、result,会发现,得到只是一个张量的结构,包含了名字(name)、形状(shape)、类型(type)。

张量名称

每个张量都有一个名称,而且是唯一的,张量的命名规则是“node:src_output”,node表示结点,src_output表示当前张量来自结点的第几个输出(从0开始)。每种计算都会有一个默认的结点名称,比如constant默认生成的结点名称就是“Const”,我们可以通过name参数来更改默认的结点名称。

In [2]:

代码语言:javascript
复制
tf.constant([1,2,3], name="constant")

Out[2]:

代码语言:javascript
复制
<tf.Tensor 'constant:0' shape=(3,) dtype=int32>

上面张量的名称为“constant:0”,“constant”表示节点名称,“0”表示对应的编号。

张量形状

在通过 tf.ones/tf.zeros 等方法创建张量时,可以通过shape参数来指定不同的形状。

In [3]:

代码语言:javascript
复制
o1 = tf.ones(shape=(4, 5, 2))o1

Out[3]:

代码语言:javascript
复制
<tf.Tensor 'ones:0' shape=(4, 5, 2) dtype=float32>

可以调用 tf.reshape 方法来改变张量的形状。

Tips: 可以使用 -1 来智能推断维度

In [4]:

代码语言:javascript
复制
print(tf.reshape(o1, shape=(4, 10)))# 使用 -1 自动推断维度print(tf.reshape(o1, shape=(2, -1)))
代码语言:javascript
复制
Tensor("Reshape:0", shape=(4, 10), dtype=float32)
Tensor("Reshape_1:0", shape=(2, 20), dtype=float32)

张量类型

除了形状之外,每个张量还有一个属性是类型,用来表示张量中每个元素的数据类型。可以使用 tf.cast 来转换类型。

一般在使用 tf.placeholder 创建张量的时候经常会指定张量类型。

tf.placeholder 创建的张量其实也是一种常量,不过它可以指定

In [5]:

代码语言:javascript
复制
tf.cast(o1, dtype=tf.int8)

Out[5]:

代码语言:javascript
复制
<tf.Tensor 'Cast:0' shape=(4, 5, 2) dtype=int8>

张量求值

想要获取张量真正的数值,需要构建一个图(Graph),然后创建一个会话(Session)。

求值的最简单的方法是使用Tensor.eval方法。Tensor.eval返回与张量相同内容的numpy数组。

In [6]:

代码语言:javascript
复制
# 张量求值sess = tf.InteractiveSession()print("result: %s" % result.eval())sess.close()
代码语言:javascript
复制
result: [ 3.  5.]

占位符

TensorFlow 提供了占位符的功能,可以使用 tf.placeholder 来实现,使用 placeholder 可以先定义形状、类型、名称,等到调用执行的时候再赋予具体的数值。

先定义占位符类型为 tf.float16,执行的时候再通过 feed_dict 来赋予数值。

In [7]:

代码语言:javascript
复制
with tf.Session():
    p1 = tf.placeholder(dtype=tf.float16)
    p2 = p1 + 1.0
    print(p2.eval(feed_dict={p1: 2.0}))
代码语言:javascript
复制
3.0

定义占位符类型为 tf.float16,shape为(None, 2),表示最后接收的数据的形状的第一个维度可以是大于1的任意值,第二个维度必须是2。

In [8]:

代码语言:javascript
复制
# 先定义占位符类型为 tf.float16,执行的时候再通过 feed_dict 来赋予数值with tf.Session():
    p1 = tf.placeholder(dtype=tf.float16, shape=(None, 2))
    p2 = p1 + 1.0
    print(p2.eval(feed_dict={p1: [[1.0, 2.0], [10.0, 20.0]]}))
代码语言:javascript
复制
[[  2.   3.]
 [ 11.  21.]]

ipynb文件预览:

http://nbviewer.jupyter.org/github/Oner-wv/TensorFlow-Note/blob/master/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/01.%E5%BC%A0%E9%87%8F%EF%BC%88Tensor%EF%BC%89.ipynb

github代码地址:

https://github.com/Oner-wv/TensorFlow-Note/blob/master/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/01.%E5%BC%A0%E9%87%8F%EF%BC%88Tensor%EF%BC%89.ipynb

作者:无邪,个人博客:脑洞大开,专注于机器学习研究。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 脑洞科技栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 张量
    • 张量名称
      • 张量形状
        • 张量类型
          • 张量求值
            • 占位符
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档