您的位置:首页 > 其它

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

2019-01-11 10:12 363 查看

张量
TensorFlow名字可以拆解为两部分:Tensor、Flow。其中,Tensor 就表示张量。
在 TensorFlow 的世界里,张量可以简单理解为多维数组。其中,零阶张量表示常量(constant),也就是一个数;一阶张量表示向量(vector),也就是一个一维数组;二阶张量表示矩阵(matrix),也就是一个二维数组;n阶张量表示n维数组。
与Python numpy中多维数组不同的是,TensorFlow 中的张量并没有真正保存数字,它保存的是如何得到这些数字的计算过程。
In [1]:
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)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]:
tf.constant([1,2,3], name="constant")Out[2]:
<tf.Tensor 'constant:0' shape=(3,) dtype=int32>上面张量的名称为“constant:0”,“constant”表示节点名称,“0”表示对应的编号。张量形状在通过 tf.ones/tf.zeros 等方法创建张量时,可以通过shape参数来指定不同的形状。
In [3]:
o1 = tf.ones(shape=(4, 5, 2))o1Out[3]:
<tf.Tensor 'ones:0' shape=(4, 5, 2) dtype=float32>可以调用 tf.reshape 方法来改变张量的形状。
Tips: 可以使用 -1 来智能推断维度
In [4]:
print(tf.reshape(o1, shape=(4, 10)))# 使用 -1 自动推断维度print(tf.reshape(o1, shape=(2, -1)))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]:
tf.cast(o1, dtype=tf.int8)Out[5]:
<tf.Tensor 'Cast:0' shape=(4, 5, 2) dtype=int8>张量求值想要获取张量真正的数值,需要构建一个图(Graph),然后创建一个会话(Session)。
求值的最简单的方法是使用Tensor.eval方法。Tensor.eval返回与张量相同内容的numpy数组。
In [6]:
# 张量求值sess = tf.InteractiveSession()print("result: %s" % result.eval())sess.close()result: [ 3.  5.]占位符TensorFlow 提供了占位符的功能,可以使用 tf.placeholder 来实现,使用 placeholder 可以先定义形状、类型、名称,等到调用执行的时候再赋予具体的数值。
先定义占位符类型为 tf.float16,执行的时候再通过 feed_dict 来赋予数值。
In [7]:
with tf.Session():
   p1 = tf.placeholder(dtype=tf.float16)
   p2 = p1 + 1.0
   print(p2.eval(feed_dict={p1: 2.0}))3.0定义占位符类型为 tf.float16,shape为(None, 2),表示最后接收的数据的形状的第一个维度可以是大于1的任意值,第二个维度必须是2。
In [8]:
# 先定义占位符类型为 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]]}))[[  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

了解更多,可以关注博主公众号或者加入知识星球。

了解更多干货文章,可以关注小程序八斗问答

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: