├── vector.jpeg ├── source ├── out.png ├── jiaochashang.png ├── active_function.png └── new_qianzhichuanbo.png ├── code └── testTensorflow.py ├── python ├── python.md ├── Day01_Variable.py └── Day02_SimpleTrain.py └── README.md /vector.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UCodeUStory/DeepLearn-Tensorflow/HEAD/vector.jpeg -------------------------------------------------------------------------------- /source/out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UCodeUStory/DeepLearn-Tensorflow/HEAD/source/out.png -------------------------------------------------------------------------------- /source/jiaochashang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UCodeUStory/DeepLearn-Tensorflow/HEAD/source/jiaochashang.png -------------------------------------------------------------------------------- /source/active_function.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UCodeUStory/DeepLearn-Tensorflow/HEAD/source/active_function.png -------------------------------------------------------------------------------- /source/new_qianzhichuanbo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UCodeUStory/DeepLearn-Tensorflow/HEAD/source/new_qianzhichuanbo.png -------------------------------------------------------------------------------- /code/testTensorflow.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | 3 | # 输出Hello, TensorFlow! 4 | hello = tf.constant('Hello, TensorFlow!') 5 | sess = tf.Session() 6 | print sess.run(hello) 7 | 8 | # 计算 10 + 32 并输出 9 | a = tf.constant(10) 10 | b = tf.constant(32) 11 | print (sess.run(a+b)) 12 | 13 | # 把一个1*2的矩阵和一个2*1的矩阵相乘并输出 14 | matrix1 = tf.constant([[3., 3.]]) 15 | matrix2 = tf.constant([[2.],[2.]]) 16 | product = tf.matmul(matrix1, matrix2) 17 | result = sess.run(product) 18 | print result 19 | 20 | sess.close() 21 | -------------------------------------------------------------------------------- /python/python.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | #Python3 学习 4 | 5 | 6 | 1. With语句是什么? 7 | 8 | 有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。 9 | 如果不用with语句,代码如下: 10 | file = open("/tmp/foo.txt") 11 | try: 12 | data = file.read() 13 | finally: 14 | file.close() 15 | 16 | 虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码: 17 | with open("/tmp/foo.txt") as file: 18 | data = file.read() 19 | 20 | 2. with如何工作? 21 | 22 | 这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。 23 | 24 | 紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。 -------------------------------------------------------------------------------- /python/Day01_Variable.py: -------------------------------------------------------------------------------- 1 | import os 2 | os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 3 | import tensorflow as tf 4 | 5 | #声明w1,w2两个变量。这里还通过seed参数设定随机种子 6 | #这样可以保证每一次运行得到的结果是一样的 7 | w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) 8 | w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) 9 | 10 | x= tf.constant([[0.7,0.9]]) 11 | 12 | a = tf.matmul(x,w1) 13 | y = tf.matmul(a,w2) 14 | 15 | sess = tf.Session() 16 | #必须调用初始化函数,tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Variable 17 | #sess.run(w1.initializer) 18 | #sess.run(w2.initializer) 19 | 20 | # 也可以统一初始化 21 | #init_op = tf.initialize_all_variables() 22 | init_op = tf.global_variables_initializer() 23 | sess.run(init_op) 24 | ##变量的声明函数是一种运算,运算结果是一个张量,所以变量是张量的一种 25 | 26 | #tf.global_variables tf.all_variables 27 | for variable in tf.global_variables(): 28 | print(variable) 29 | 30 | print(sess.run(w1)) 31 | print(sess.run(w2)) 32 | print(sess.run(y)) 33 | sess.close() 34 | 35 | 36 | -------------------------------------------------------------------------------- /python/Day02_SimpleTrain.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | 3 | #NumPy 是一个科学计算的工具包,这里通过NumPy工具包生成模拟数据集 4 | from numpy.random import RandomState 5 | 6 | #定义训练数据batch的大小 7 | batch_size = 8; 8 | # 定义神经网络的参数,2x3矩阵,标准差1 9 | ''' 10 | 在训练样本之前w1数据 11 | [[-0.8113182 1.4845988 0.06532937] 12 | [-2.4427042 0.0992484 0.5912243 ]] 13 | 在训练样本之前w2数据 14 | [[-0.8113182 ] 15 | [ 1.4845988 ] 16 | [ 0.06532937]] 17 | ''' 18 | w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) 19 | w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) 20 | 21 | # tf.placeholder(dtype, shape=None, name=None) 22 | # dtype:数据类型。常用的是tf.float32,tf.float64等数值类型 23 | # shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定 24 | # name:名称 25 | x = tf.placeholder(tf.float32,shape=(None,2),name='x-input') 26 | y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input') 27 | 28 | # 矩阵相乘 29 | a = tf.matmul(x,w1) 30 | y = tf.matmul(a,w2) 31 | 32 | #定义损失函数的反向传播的算法 33 | 34 | cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0))) 35 | train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy) 36 | 37 | #通过随机数生成一个模拟数据集。0~1之间的数 38 | rdm = RandomState(1) 39 | #数据产生128行 40 | dataset_size = 128 41 | #产生128行,每行2列的数据,X表示的是矩阵(128x2),实际用数组表示 42 | #由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。 43 | X = rdm.rand(dataset_size,2) 44 | 45 | #print(X) 46 | ''' 47 | 4.17022005e-01 就是 0.417022005 9.23385948e-02 0.0923385948e-02 48 | [[4.17022005e-01 7.20324493e-01] 49 | [1.14374817e-04 3.02332573e-01] 50 | . 51 | . 52 | . 53 | [3.76580315e-01 9.73783538e-01] 54 | [6.04716101e-01 8.28845808e-01]] 55 | ''' 56 | 57 | # 定义规则来给出样本的标签,这里所有x1+x2<1的样例都被认为是正样本(比如合格零件) 58 | # 而其他为负样本。 在这里0来表示负样本,1来表示正样本 59 | # 生成和X行数相同,列数为1的矩阵,这个矩阵里面是1和0为X矩阵每个做标记用 60 | Y = [[int(x1+x2 <1)] for (x1,x2) in X] 61 | 62 | print(Y) 63 | 64 | 65 | # 创建一个会话来运行TensorFlow程序 66 | with tf.Session() as sess: 67 | init_op = tf.global_variables_initializer() 68 | #初始化变量。 69 | sess.run(init_op) 70 | print (sess.run(w1)) 71 | print (sess.run(w2)) 72 | 73 | #设定训练的轮数 ,9000次就能够确定参数 74 | STEPS = 20000 75 | for i in range(STEPS): 76 | #每次选取batch_size个样本进行训练,这里一轮8个 77 | start = (i * batch_size) % dataset_size 78 | end = min(start + batch_size,dataset_size) 79 | 80 | #通过选取的样本训练神经网络 并更新参数。train_step 81 | #feed_dict 里面的值可以是一个数据赋值,也可以是一组数据赋值,具体按照上面定义来 82 | sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]}) 83 | 84 | if i %1000 == 0: 85 | # 每隔一段时间计算在所有数据上的交叉熵并输出 86 | total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y}) 87 | 88 | print("After %d trainning step(s),cross entropy on all data is %g" %(i,total_cross_entropy)) 89 | 90 | print(sess.run(w1)) 91 | print(sess.run(w2)) 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DeepLearn-Tensorflow 2 | 开始迈向人工智能,学习主流的深度学习框架Tensorflow 3 | 4 | ## 概念 5 | 人工智能、机器学习、深度学习都什么区别? 6 | 7 | 一、按照提出时间顺序分 8 | 9 | 1. 1956年,几个计算机科学家相聚在达特茅斯会议(Dartmouth Conferences),提出了“人工智能(Artificial Intelligence 简称AI)”的概念。简单解释为机器赋予人的智能; 10 | 11 | 2. Langley(1996) 定义的机器学习是“机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能; 12 | ----机器学习是实现人工智能的一种方法 13 | 14 | 3. 深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本;深度学习——一种实现机器学习的技术,深度学习使得机器学习能够实现众多的应用,并拓展了人工智能的领域范围。 15 | 16 | ## Tensorflow (Google深度学习框架) 17 | 1. 安装 18 | 19 | [官方文档](https://www.tensorflow.org/install/) 20 | 21 | 2. python3 22 | 23 | [学习地址](http://www.runoob.com/python3/python3-tutorial.html) 24 | 3. TensorFlow中两个重要的工具 25 | 26 | - ProTocol Buffer:谷歌开发的处理结构化数据的工具。它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。 27 | 28 | - Bazel :谷歌开元的自动化构建工具,相比MakeFile、Ant、Maven,Bazel在速度、可伸缩性、灵活性、以及对不同程序语言和平台的支持都要更出色,Tensorflow本身就是由Bazel来编译的 29 | Bazel 对python支持的遍历方式三种,py_binary,py_library,py_test,分别是编译成可执行文件,函数库,测试程序 30 | 31 | 4. TensorFlow入门开始 32 | - 1. TensorFlow 计算模型--计算图 33 | TensorFlow Tensor和Flow组成,Tensor是张量的意思,Flow是流的意思,TensorFlow是一个通过计算图的形式来表述计算的编译系统。每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的依赖关系。 34 | 35 | - 2. TensorFlow程序一般可以分为两个阶段 36 | 在第一个阶段需要定义的计算图中所有的计算,第二个阶段就是执行计算 37 | 38 | - 3. TensorFlow数据模型--张量 39 | 张量是TensorFlow管理数据的形式,在TensorFlow 中所有数据都是通过张量的形式来表示,张量可以简单的理解成多维数组 40 | 41 | import tensorflow as tf 42 | a = tf.constant([1.0,2.0],name="a") #constant是一个计算,计算结果为一个张量,保存在变量a中 43 | b = tf.constant([2.0,3.0],name="b") 44 | result = tf.add(a,b,name="add") 45 | print result 46 | 47 | 输出结果 Tensor("add:0",shape=(2,),dtype=float32) 48 | 49 | Tensorflow 计算结果不是一个值,而是一个张量的结构;上面打印结果表示这个张量的名字为”add:0“(这是张量的唯一标识符),shape表示维度信息,上面表示的则就是1维数组,长度是2,第三个属性也就是类型,每个张量会有唯一类型,不同类型不能直接操作 50 | 51 | 例如: 52 | 53 | import tensorflow as tf 54 | a = tf.constant([1,2],name="a") 55 | b = tf.constant([2.0,3.0],name="b") 56 | result = a + b 57 | ## 这里程序就会报错 58 | 指定类型避免报错 59 | a = tf.constant([1,2],name="a",dtype=tf.float32) 这样子就不报错了 60 | 61 | - 4. 张量的使用 62 | 1 保存中间结果,增加可读性 63 | 64 | 2 当计算图构造完成之后,张量可以用来获取计算结果,也就是得到真实数据,虽然张量本身没有存储具体的数字,但是可以通过会话就可以得到这些具体的数字了 65 | 66 | 67 | 比如上面的代码就可以使用 tf.Session().run(result)语句来计算结果 68 | - 5. TensorFlow运行模型-- 会话 69 | 前面介绍了TensorFlow是如何组织数据和运算的。接下来我们需要通过tensorFlow中的会话来执行定义好的运算 70 | 71 | ** 会话拥有并管理TensorFlow运行时的所有资源,当所有计算完之后必须关闭,否者,就会出现内存泄露的问题 72 | 73 | ** 会话的种类一般分为两种 74 | - 需要明确的调用会话的生成函数和关闭函数 75 | 形式如: 76 | 77 | sess = tf.Session() 78 | sess.run(...) 79 | sess.close() 80 | 81 | ** 上面如果在执行过程中发现了异常,就会到时sess.close()不会被执行,所以python中可以用with语句来管理,这样也就不需要手动调用close,python会自动调用 82 | 83 | 84 | with tf.Session() as sess: 85 | sess.run(...) 86 | 87 | - 6. TensorFlow实现神经网络 88 | 提取特征向量 89 | 卡迪尔坐标系 90 | - 1.所谓神经网络结构就是指不同神经元之间连接的结构 91 | - 2.一个神经元可以有多个输入,但只有一个输出,一个神经元的输出可以作为下一个神经元的输入 92 | - 3.前向传播算法 93 | - 4.全连接神经网络前向传播算法:相邻两层之间任意两个节点都有链接 94 | - 5.除了输入层之外的节点都代表了一个神经元的结构,一个神经元也叫一个节点,每一个节点的取值都是输入层取值的加权和(X1*W1+X2*W2..) 95 | - 6.前向传播算法可以理解为向量的乘法 96 |       97 | - [前向传播算法计算图解](https://github.com/UCodeUStory/DeepLearn-Tensorflow/blob/master/vector.jpeg) 98 | - [矩阵和方程转换详解](http://www.ruanyifeng.com/blog/2015/09/matrix-multiplication.html) 99 | 100 | 变量的声明:tf.Variable(tf.random_normal([2,3],stddev=2))//生成变量,必须初始值 101 | 初始值得方法有很多,这里使用随机数生成函数,产生一个2x3矩阵,均值为0(mean可以指定均值,默认0),标准差2 102 | 103 | - 7. 通过TensorFlow训练神经网络模型 104 | 105 | 1.监督式学习:监督式学习的重要思想就是,在已知答案的标注数据集上,模型给出的数据结果要尽量接近真实答案.通过调整神经网络中的参数对训练数据的拟合,可以使得模型对未知数据样本达到预测能力 106 | 107 | 2.神经网络优化算法中,反向传播算法是最常用的方式 108 | 109 | 总结:训练神经网络需要3个步骤 110 | - 1定义神经网络结构和前向传播的结果 111 | - 2定义损失函数以及反向传播优化算法 112 | - 3生成会话,并在训练数据上反复运行反向传播优化算法 113 | 114 | 5. 优化神经网络(更好的对未知样本预测) 115 | 1. 深度学习: 116 | - 线性模型的局限性,生活中大多数问题是不能线性的解决 117 | - 线性函数与非线性函数:指的就是一次函数y= ax+b,其他x非一次幂的函数都是非线性的函数,曲线 118 | - 深度学习:一类通过多层非线性变换对高复杂性数据建模算法的集合,因为深层神经网络是实现“多层非线性变化的常用方法”,所以在实际当中,可以认为深度学习就是深层神经网络的代名词 119 | - 深度学习的特性:多层和非线性 120 | - 激活函数去实现非线性化: 121 | 前面神经元的输出都是所有输入的加权和,导致整个神经网络是个线性模型,如果每隔神经元的输出通过一个非线性函数,name整个神经网络的模型也就不再是线性的了,这个非线性的函数就是激活函数。 122 | - 偏置项: 123 | 偏置项是神经网络中非常常用的一种结构。偏执项可以表达为输入项永远为1的节点 124 | - Tensorflow 中提供7种激活函数:常用的分别是tf.nn.relu tf.sigmoid tf.tanh,也支持使用自定义激活函数 125 | 126 | a = tf.nn.relu(tf.matmul(x,w1) + b1) 127 | y = tf.nn.relu(tf.matmul(a,w2) + b2) 128 | 129 | - [常用激活函数](https://github.com/UCodeUStory/DeepLearn-Tensorflow/blob/master/source/active_function.png) 130 | - [加上激活函数和偏置项的算法公式](https://github.com/UCodeUStory/DeepLearn-Tensorflow/blob/master/source/new_qianzhichuanbo.png) 131 | - [输出层计算公式图解](https://github.com/UCodeUStory/DeepLearn-Tensorflow/blob/master/source/out.png) 132 | - 多层网络可以解决异或问题 133 | 2. 合理设定神经网络优化目标(也就是定损函数)、常用定损函数 134 | - 分类问题和回归问题是监督学习的两大种类 135 | - 分类问题一般有多个结果,回归问题一般就一个结果 136 | - 分类问题最长用的损失函数交叉熵计算 137 | - 回归问题最长用的损失函数均方差 138 | - 交叉熵:计算概率分布的距离 139 | - 有一个三分类问题:某样例正确答案是(1,0,0),预测答案是(0.5,0.4,0.1) 140 | 141 | [交叉熵的计算](https://github.com/UCodeUStory/DeepLearn-Tensorflow/blob/master/source/jiaochashang.png) 142 | 143 | - Tensorflow交叉熵的计算 144 | 145 | cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0))) 146 | 其中这里包含四个不同的Tensorflow运算 147 | 第一步: 148 | tf.clip_by_value可以将一个张量的数值限制一个范围,也就是矩阵中的数值做限制,避免出现log0这种问题 149 | 例如v = tf.constant([[ 1.0,2.0,3.0],[4.0,5.0,6.0]]) 150 | print (tf.clip_by_value(v,2.5,4.5).eval()) 151 | #输出 [[2.5,2.5.3.0],[4.0,4.5,4.5]] 152 | 第二步:计算tf.log 153 | 第三步:两个矩阵通过“*”不是矩阵的乘法,而是矩阵元素之间相乘 154 | v1 = tf.constant([[1.0,2.0],[3.0,4.0]]) 155 | v2 = tf.constant([[5.0,6.0],[7.0,8.0]]) 156 | print(v1*b2).eval() 157 | # 输出[[5.0,12.0][21.0,32.0]] 158 | 前三步结果:nxm的二维矩阵,其中n为一个batch中的样例数量,m为分类的类别数量 159 | 第四步:求取nxm的每一行交叉熵,然后对n行取平局值 160 | print (tf.reduce_mean(v).eval()) 161 | 162 | - 自定义损失函数 163 | - 自定义损失函数使得神经网络结果更趋向与真实值 164 | 165 | ## 代码 166 | - [Day01参数变量的使用](https://github.com/UCodeUStory/DeepLearn-Tensorflow/blob/master/python/Day01_Variable.py) 167 | - [Day02完整的神经网络训练](https://github.com/UCodeUStory/DeepLearn-Tensorflow/blob/master/python/Day02_SimpleTrain.py) 168 | 169 | 170 | --------------------------------------------------------------------------------