Skip to main content

TF入门:关于图的我的理解

    TensorFlow以下简称TF,里面很多华丽的新词汇,什么基于数据流图,什么张量等等,而且TF的代码编写方式大大出乎初学者的意料,和我们以前传统的编写代码方式很不同,初学一头雾水。。我先讲一下我理解的概念:
    先说什么是图。
    先扯远一些,说说编码历史。
    最初我们编码需要自己写一个流程图,上面有什么判断循环之类的图形和线条,然后我们按照流程图的思路编写代码。后来随着系统越来越复杂,产生了类的概念,我们像搭积木一样,利用类组建编程。这时候,设计的一个个类是静止的,只有在函数里面引用或者在主函数里面调用,才会运行这些积木。再往后,又将各种类打包,形成类库的概念,此时编程就是模块化编程。我们看到,基本代码在一层层的被封装,看起来变得更容易使用,但是产生的很多新东西需要我们接受,理解并花时间去学习。
    我们知道神经网络就是一个个节点,权重关系和激活函数组成的,构成就这么简单,在设计神经网络之前,我们往往要规划网络的节点数,权重等,就像画出网络图一样:
    我们编程的时候,就像画图或者设计图一样,先产生一个个的节点或权重变量,这部分代码运行所在空间,就是图,貌似很酷很炫的名字。而数据在节点之间的来回传递,就是数据流。基于这个牵强的图概念和数据的流动,就是所谓的数据流图。
    简单说一下什么是张量,有一个炫酷高深的名词。
说白了就是几维的数据。一个数字是标量:0维,两个成对的是向量:1维,一个表格是矩阵:2维,向上还有3维4维的数据,成为n维数据,都可以称为张量,事实上经常将3维以上的称为张量。其实就是数据的一种格式。


Comments

Popular posts from this blog

神经网络(容易被忽视的基础知识)

神经网络(容易被忽视的基础知识) Evan 180 人赞了该文章 以下大多笔记主要来自cs231n和其他深度学习资料和一些我自己的补充,首先CS231n一个非常不错的deep learning课,值得一看,奉上 链接 ,然后,cs231n本身是有笔记的- 链接 ,最后,知乎上的一些大神对这个笔记进行了翻译--- 链接 。在这里,我主要是将一些重要的笔记,我认为是比较容易被我们忽视的,加上查阅其他博文,做一个笔记和心得总结! 这次主要讲解的内容有: 基本神经元 作为线性分类器的单个神经元 为什么要是深度神经网而不是”肥胖“神经网络? 为什么在人工神经网络中的神经元需要激活函数? 一些主要的激活函数 神经网络中的偏置有什么意义? 初始化神经网络的参数可以全为0吗,其他普通线性分类器呢? 交叉熵损失存在的意义和与平方差损失相比有什么好处? 神经元 下面图表的左边展示了一个生物学的神经元,右边展示了一个常用的数学模型。乍一看还是有点相似的,事实上也是,人工神经网络中的神经元也有受到生物神经元的启发。总结要点: 在生物的神经元(也就是左图)中,树突将信号传递到细胞体,信号在细胞体中相加。如果最终之和高于某个阈值,那么神经元将会 激活 ,向其轴突输出一个峰值信号, 注意这里输出是一个脉冲信号! 在数学计算模型(也就是右图)中,首先将输入 进行加权求和加上偏执 ,得到待激励值,然后将该值作为输入,输入到 激活函数 中,最后输出的是一个 激励后的值 ,这里的激活函数可以看成对生物中神经元的激活率建模。由于历史原因,激活函数常常选择使用 sigmoid函数  , 当然还有很多其他激活函数,下面再仔细聊! 需要注意: 1.一个神经元可以看成 包含两个部分 ,一个是对输入的加权求和加上偏置,一个是激活函数对求和后的激活或者抑制。2.注意生物中的神经元要复杂的多,其中一个是生物中的输出是一个脉冲,而现在大多数的数学模型神经输出的就是一个值,当然现在也有一些脉冲人工神经网络,可以自行了解! 作为线性分类器的单个神经元 比如基础的逻辑回归,结合上面的神经元知识,可以发现,逻辑回归就是激活函数是 sigmoid 的单层简单神经网络。也就是说,只要在神经元...

TF random_normal和Python random.normal的用法

先看TF tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值。 tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) 再看NP np.random.normal()给出均值为loc,标准差为scale的高斯随机数(场). numpy.random.normal(loc=0.0, scale=1.0, size=None) 所谓正态分布==高斯分布,所以二者一回事 mean==loc==均值(或称期待值) stddev==scale==标准差 shape==size==输出形状,二者在处理这个参数时候(a,b)==[a,b],其中,np的normal对参数格式要求更灵活一些。 比如创建随机数的一行两列数组: np.random.normal([2])==np.random.normal((2))==np.random.normal(0,1,2)注意最后一种用法必须带上前面两个参数,否则传递参数时候会把2当作均值传递 而tf的random_normal对shape的要求不能是数字,必须为[]或()格式 再探究一下形状参数的规律,看下面代码 a=np.random.normal(0,1,(2,1)) b=np.random.normal(0,1,(1,2)) c=np.random.normal(0,1,(2)) print(a) print(a.shape) print(b) print(b.shape) print(c) print(c.shape) 程序输出如下 [[ 1.11843359] [-0.69801129]] (2, 1) [[-0.87110089 -0.46089345]] (1, 2) [ 0.88227522 -0.26728542] (2,) a,b是二维的矩阵,c是一维的矩阵(严格说一维的不是矩阵)

tf.split用法

按照行或者列分割一个矩阵 第一个参数是待切分的张量,第二个是切分的大小,共切分为三个,每一个分别为4列,15列,11列。第三个参数为1表示按照列切分,为0表示按照行切分。 切分的子块的大小加起来应该等于母块的大小。比如这个例子,4+15+11=30列 看下面的代码例子