资讯专栏INFORMATION COLUMN

Tensorflow快餐教程(3)- 向量

draveness / 3491人阅读

摘要:向量虽然简单,高效,且容易理解。快速生成向量的方法函数生成等差数列函数用来快速生成一个等差数列。例拼瓷砖就是将一段向量重复若干次。向量操作将向量反序可以使用函数。向量计算向量加减法同样长度的向量之间可以进行加减操作。

摘要: Tensorflow向量操作

向量

向量在编程语言中就是最常用的一维数组。
二维数组叫做矩阵,三维以上叫做张量。

向量虽然简单,高效,且容易理解。但是与操作0维的标量数据毕竟还是不同的。比如向量经常用于表示一个序列,生成序列像标量一样一个一个手工写就不划算了。当然可以用循环来写。在向量中这样还好,如果是在矩阵或者是张量中就强烈建议不要用循环来做了。系统提供的函数一般都是经过高度优化的,而且可以使用GPU资源来进行加速。
我们一方面尽可能地多使用系统的函数,另一方面也不要迷信它们,代码优化是一个实践的过程,可以实际比较测量一下。

快速生成向量的方法

range函数生成等差数列
tf.range函数用来快速生成一个等差数列。相当于之前我们讲numpy时的np.arange函数。

原型:

tf.range(start, limit, delta=1, dtype=None, name="range")

例:

>>> b11 = tf.range(1,100,1)
>>> b11

>>> sess.run(b11)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
       35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
       52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
       69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
       86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
      dtype=int32)
linspace生成浮点等差数组

tf.linspace与tf.range的区别在于,数据类型不同。

tf.lin_space(
    start,
    stop,
    num,
    name=None
)

其中,start和stop必须是浮点数,且类型必须相同。num必须是整数。

例:

>>> a2 = tf.linspace(1.0,10.0,4)  
>>> a2

>>> sess.run(a2)
array([ 1.,  4.,  7., 10.], dtype=float32)
拼瓷砖

就是将一段向量重复若干次。

>>> a10 = tf.range(1,4,1)
>>> sess.run(a10)
array([1, 2, 3], dtype=int32)
>>> a11 = tf.tile(a10,[3])
>>> sess.run(a11)
array([1, 2, 3, 1, 2, 3, 1, 2, 3], dtype=int32)
向量操作

将向量反序
可以使用tf.reverse函数。
原型:

tf.reverse(
    tensor,
    axis,
    name=None
)

tensor是向量,axis轴对于向量不重要,给个[-1]就可以了。折腾轴是张量时间的事情,暂时还用不到。

>>> a2 = tf.linspace(1.0,10.0,4)
>>> a3 = tf.reverse(a2,[-1])
>>> sess.run(a3)
array([10.,  7.,  4.,  1.], dtype=float32)
切片

切片也是向量的常用操作之一,就是取数组的一部分。

例:

>>> a5 = tf.linspace(1.0,100.0, 10)
>>> sess.run(a5)
array([  1.,  12.,  23.,  34.,  45.,  56.,  67.,  78.,  89., 100.],
      dtype=float32)
>>> a6 = tf.slice(a5, [2],[4])
>>> sess.run(a6)
array([23., 34., 45., 56.], dtype=float32)

将来处理张量时,我们从一个矩阵切一块,或从一个张量中切一块,就好玩得多了。但是原理跟向量上是一样的。

连接

tf.concat也是需要给定轴信息的。对于两个线性的向量,我们给0或者-1就好。

>>> a20 = tf.linspace(1.0,2.0,10)
>>> sess.run(a20)
array([1.       , 1.1111112, 1.2222222, 1.3333334, 1.4444444, 1.5555556,
       1.6666667, 1.7777778, 1.8888888, 2.       ], dtype=float32)
>>> a21 = tf.linspace(2.0,3.0,5)
>>> sess.run(a22)
array([1.       , 1.1111112, 1.2222222, 1.3333334, 1.4444444, 1.5555556,
       1.6666667, 1.7777778, 1.8888888, 2.       , 2.       , 2.25     ,
       2.5      , 2.75     , 3.       ], dtype=float32)
>>> a23 = tf.concat([a20,a21],-1)
>>> sess.run(a23)
array([1.       , 1.1111112, 1.2222222, 1.3333334, 1.4444444, 1.5555556,
       1.6666667, 1.7777778, 1.8888888, 2.       , 2.       , 2.25     ,
       2.5      , 2.75     , 3.       ], dtype=float32)
向量计算

向量加减法
同样长度的向量之间可以进行加减操作。

例:

>>> a40 = tf.constant([1,1])
>>> a41 = tf.constant([2,2])
>>> a42 = a40 + a41
>>> sess.run(a42)
array([3, 3], dtype=int32)
>>> a43 = a40 - a41
>>> sess.run(a43)
array([-1, -1], dtype=int32)
>>> a43

向量乘除标量
向量乘除标量也非常好理解,就是针对向量中的每个数都做乘除法。

例:

>>> a44 = a40 * 2
>>> sess.run(a44)
array([2, 2], dtype=int32)
>>> a45 = a44 / 2  
>>> sess.run(a45)
array([1., 1.])
>>> a44

>>> a45

广播运算
如果针对向量和标量进行加减运算,也是会对向量中的每个数进行加减运算。这种操作称为广播操作。

例:

**>>> a46 = a40 + 1

sess.run(a46)
array([2, 2], dtype=int32)
a46
**
小结

从上面我们学习的函数我们可以看到,与普通语言中提供的函数多是为一维数组操作不同,Tensorflow中的切片、拼接等操作也是基于张量的。
当我们后面学到张量遇到困难时,不妨回来看下这一节。不管后面张量多么复杂,其实也只是从一维向二维和多维推广而己。

详情请阅读原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41588.html

相关文章

  • Tensorflow快餐教程(5) - 范数

    摘要:当时,范数称为欧几里得范数。更严格地说,范数是满足下列性质的任意函数这条被称为三角不等式范数的推广除了范数之外,在机器学习中还常用范数,就是所有元素的绝对值的和。 摘要: 范数的定义和Tensorflow实现 矩阵进阶 - 范数 作为快餐教程,我们尽可能多上代码,多介绍工具,少讲原理和公式。但是我也深知这样是无法讲清楚的,毕竟问题的复杂度摆在这里呢。与大家一起在Tensorflow探索...

    RancherLabs 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<