向量

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

向量虽然简单,高效,且容易理解。但是与操作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
<tf.Tensor 'range:0' shape=(99,) dtype=int32>
>>> 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
<tf.Tensor 'LinSpace_2:0' shape=(4,) dtype=float32>
>>> 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
<tf.Tensor 'sub:0' shape=(2,) dtype=int32>

向量乘除标量

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

例:

>>> a44 = a40 * 2
>>> sess.run(a44)
array([2, 2], dtype=int32)
>>> a45 = a44 / 2
>>> sess.run(a45)
array([1., 1.])
>>> a44
<tf.Tensor 'mul:0' shape=(2,) dtype=int32>
>>> a45
<tf.Tensor 'truediv_1:0' shape=(2,) dtype=float64>

广播运算

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

例:

>>> a46 = a40 + 1
>>> sess.run(a46)
array([2, 2], dtype=int32)
>>> a46
<tf.Tensor 'add_1:0' shape=(2,) dtype=int32>

向量乘法

两个向量相乘,默认的运算是求元素对应乘积(element-wise product),也叫做Hadamard积。

例:

>>> b1 = tf.constant([1,2])
>>> b2 = tf.constant([2,1])
>>> b3 = b1 * b2
>>> b3
<tf.Tensor 'mul_7:0' shape=(2,) dtype=int32>
>>> sess.run(b3)
array([2, 2], dtype=int32)

直接调用tf.multiply也是同样的效果,例:

>>> b4 = tf.multiply(b1,b2)
>>> b4
<tf.Tensor 'Mul_2:0' shape=(2,) dtype=int32>
>>> sess.run(b4)
array([2, 2], dtype=int32)

如果要计算点积(dot product)的话,我们得提前剧透一下矩阵的内容了。
首先,用向量是没法做矩阵计算的。
例:

>>> a21 = tf.constant([2,3])
>>> a22 = tf.constant([4,5])
>>> a21
<tf.Tensor 'Const_20:0' shape=(2,) dtype=int32>
>>> a22
<tf.Tensor 'Const_21:0' shape=(2,) dtype=int32>

这样(2,)的形状是向量,我们得先把它转换成(2,1)这样的单行矩阵,如下:

>>> a31 = tf.constant(sess.run(tf.reshape(a21,[2,1])))
>>> a32 = tf.constant(sess.run(tf.reshape(a22,[2,1])))
>>> a31
<tf.Tensor 'Const_22:0' shape=(2, 1) dtype=int32>
>>> a32
<tf.Tensor 'Const_23:0' shape=(2, 1) dtype=int32>

下面我们终于可以计算点积了,我们知道点积A.B相当于A的转置乘以B,我们可以通过matmul函数来进行矩阵乘法。

>>> a31 = tf.matmul(a31,a32,transpose_a=True)
>>> sess.run(a31)
array([[23]], dtype=int32)

我们也可以用tf.tensordot函数来计算点积。我们刚才为什么没用呢?答案是tensordot要求是浮点型矩阵。
例:
第一步,需要浮点数:

>>> f01 = tf.constant([1,1],dtype=tf.float32)
>>> f02 = tf.constant([1,2],dtype=tf.float32)

第二步,reshape成单行矩阵:

>>> f11 = tf.constant(sess.run(tf.reshape(f01,[2,1])))
>>> f12 = tf.constant(sess.run(tf.reshape(f02,[2,1])))
>>> f11
<tf.Tensor 'Const_26:0' shape=(2, 1) dtype=float32>
>>> f12
<tf.Tensor 'Const_27:0' shape=(2, 1) dtype=float32>

第三步,调用tensordot

>>> f13 = tf.tensordot(f11,f12,2)
>>> sess.run(f13)
3.0

小结

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

Tensorflow快餐教程(3) - 向量相关推荐

  1. Tensorflow快餐教程(12) - 用机器写莎士比亚的戏剧

    高层框架:TFLearn和Keras 上一节我们学习了Tensorflow的高层API封装,可以通过简单的几步就生成一个DNN分类器来解决MNIST手写识别问题. 尽管Tensorflow也在不断推进 ...

  2. Tensorflow快餐教程(5) - 范数

    矩阵进阶 - 范数 作为快餐教程,我们尽可能多上代码,多介绍工具,少讲原理和公式.但是我也深知这样是无法讲清楚的,毕竟问题的复杂度摆在这里呢.与大家一起在Tensorflow探索一圈之后,我一定要写一 ...

  3. Tensorflow快餐教程(1) - 30行代码搞定手写识别

    摘要: Tensorflow入门教程1 去年买了几本讲tensorflow的书,结果今年看的时候发现有些样例代码所用的API已经过时了.看来自己维护一个保持更新的Tensorflow的教程还是有意义的 ...

  4. Tensorflow快餐教程(6) - 矩阵分解

    摘要: 特征分解,奇异值分解,Moore-Penrose广义逆 矩阵分解 特征向量和特征值 我们在<线性代数>课学过方阵的特征向量和特征值. 定义:设A∈Fn×nA∈Fn×n是n阶方阵.如 ...

  5. Tensorflow快餐教程(4) - 矩阵

    摘要: Tensorflow矩阵基础运算 矩阵 矩阵的初始化 矩阵因为元素更多,所以初始化函数更多了.光靠tf.linspace,tf.range之类的线性生成函数已经不够用了. 可以通过先生成一个线 ...

  6. Tensorflow快餐教程(7) - 梯度下降

    梯度下降 学习完基础知识和矩阵运算之后,我们再回头看下第一节讲的线性回归的代码: import tensorflow as tf import numpy as nptrX = np.linspace ...

  7. TensorFlow快餐教程:程序员快速入门深度学习五步法

    作者简介:刘子瑛,阿里巴巴操作系统框架专家:CSDN 博客专家.工作十余年,一直对数学与人工智能算法相关.新编程语言.新开发方法等相关领域保持浓厚的兴趣.乐于通过技术分享促进新技术进步. 作为一个程序 ...

  8. Tensorflow快餐教程(8) - 深度学习简史

    深度学习简史 从机器学习流派说起 如果要给机器学习划分流派的话,初步划分可以分为『归纳学习』和『统计学习』两大类.所谓『归纳学习』,就跟我们平时学习所用的归纳法差不多,也叫『从样例中学习』. 归纳学习 ...

  9. Tensorflow快餐教程(9) - 卷积

    摘要: 卷积的计算方法 卷积 卷积就是滑动中提取特征的过程 在数学中,卷积convolution是一种函数的定义.它是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠 ...

最新文章

  1. 图灵奖得主LeCun和7位华人博士当选美国科学院2021院士!!
  2. Microsoft Dynamics server 2015 所有的SQL server 2012 视图 介绍及功能
  3. [No000039]操作系统Operating Systems用户级线程User Threads
  4. xp sp3安装.Net 4.0提示严重错误,0x80070643,解决办法2017版
  5. 关于投资银行和咨询的理解和感悟
  6. SpringBoot解耦的扩展机制 Spring Factories介绍及使用
  7. C++有用的字符函数库
  8. 李洪强漫谈iOS开发[C语言-038]-if else if语句
  9. CodeForces - 1491E Fib-tree(模拟)
  10. 《好未来编程题》n个数里最小的k个
  11. 在webservice中传递Hashtable
  12. MATLAB课程表分配问题,求助matlab大神,学校的课程安排太骚了,我们压根就不用学matlab...
  13. thinkphp3.2 不同域名配置不同分组设置
  14. Window 通过cmd查看端口占用、相应进程、杀死进程等的命令
  15. uploadify php完整,uploadify.php
  16. word参考文献乱码问题
  17. 关于启动报错:Field xxxMapper in com.xxx.service.impl.xxxServiceImpl required a bean of type的解决方案
  18. Windows批处理文件bat学习(一)
  19. 2012年中国本土IC设计企业排名TOP10
  20. pdf to word android,PDF to Word Converter

热门文章

  1. IDEA 文件上面图标显示不对
  2. php函数scandir_PHP scandir( )用法及代码示例
  3. sh命令 /Linux中执行shell脚本的4种方法总结
  4. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之Grunt的使用简介...
  5. 100亿!中国联通发起设立5G产业基金
  6. Qt工程名称和文件名称的修改
  7. 编译openwrt-lede的故障排除,go模块的下载超时的问题
  8. WebStudy-CSS学习2
  9. Pandas处理excel数据笔记(数据透视|多条件筛选)
  10. Vue-Router的使用 (内涵vue过渡和动画)