《Tensorflow入门.ppt》由会员分享,可在线阅读,更多相关《Tensorflow入门.ppt(29页珍藏版)》请在三一办公上搜索。
1、,Glimpse,TensorFlow 初了解,TensorFlow是什么?,一个采用数据流图(data flow graphs),用于数值计算的开源软件库。最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究。也广泛用于其他计算领域。,TensorFlow特性,Python API高度的灵活性可移植性(Portability),Tensorflow 在CPU和GPU上运行,比如可以运行在台式机、服务器、手机移动设备等等。自动求微分性能最优化庞大的社群支持,深度学习工具对比,一些好玩的TensorFlow项目,卷积神经
2、网络实现图片风格转变s,皮肤癌图像分类,最终相关成果发表在Nature,而且在Nature的封面,这是一个特别成功地通过计算机视觉及深度学习相关的技术,利用廉价的移动设备,能够很有效地检测是否有皮肤癌,大大节省了医疗检测的成本,AlphaGo,安装(Ubuntu 16.04 64bit),1、安装Anaconda官网下载对应版本在下载目录下执行:bash 安装Spyder,sudo apt install spyder2、安装TensorFlow CPU版本方法一:pip install tensorflow方法二:下载源码安装(可对配置进行修改),TensorFlow的系统结构以C API为
3、界,将整个系统分为前端和后端两个子系统:前端系统:提供编程模型,负责构造计算图;后端系统:提供运行时环境,负责执行计算图。,架构设计,基本概念,TensorFlow核心程序由2个独立部分组成:a:Building the computational graph构建计算图 b:Running the computational graph运行计算图计算图是一系列的TensorFlow操作排列成一个有向无环图。,基本概念,TensorFlow 的 数据模型 为 tensor(张量),可简单理解为类型化的多维数组。0 维张量是一个数字,也叫标量,s=11维张量称为“向量”,v=1,2,32维张量称为
4、矩阵,m=1,2,3,4,5,6,7,8,9n维.但和Numpy 中的数组不同是,一个张量中主要保留了三个属性:name,shape,type,import tensorflow as tf a=tf.constant(1,2,3)b=tf.constant(2,3,5)result=tf.add(a,b,name=“add”)print(result),tensor(“add:0,shape=(3,),dtype=int32),add:0 表示result这个张量是计算节点“add”输出的第一个结果shape=(3,)表示张量是一个一维数组,这个数组的长度是3dtype=int32 是数据类
5、型,TensorFlow会对参与运算的所有张量进行类型的检查,当类型不匹配时会报错。,运行结果,基本概念,TensorFlow 的 计算模型 为 graph(计算图),一个 TensorFlow 图描述了计算的过程.为了进行计算,图必须在 会话 里被启动.会话 将图的 op(节点)分发到诸如 CPU 或 GPU 之类 的 设备 上,同时提供执行 op 的方法.这些方法执行后,将产生的 tensor 返回.,TensorFlow 中的每一个计算都是图上的一个节点,而节 点之间的边描述了计算之间的依赖关系,基本概念,TensorFlow 的 运行模型 为 session(会话),通过会话来执行计算
6、图,当计算完TensorFlow 使用会话的方式主要有如下两种模式:,sess=tf.Session()#创建一个会话 sess.run(result)#运行此会话 Sess.close()#运行完毕关闭此会话,运行结果,with tf.Session()as sess:sess.run(result)#通过python的上下文管理器来使用会话,当 上下文退出时会话管理和资源释放也自动完成,变量 Variable,当训练模型时,用变量来 存储和更新参数。建模时它们需要被明确地 初始化,当创建一个变量时,你将一个 张量 作为初始值传入构造函数Variable()。TensorFlow提供了一系列
7、操作符来初始化张量。,weights=tf.Variable(tf.random_normal(2,3,stddev=2),name=weights)这里生成 23 的矩阵,元素的均值为0,标准差为2(可用mean指定均值,默认值为0)。,随机数生成函数:tf.truncated_normal()正太分布,偏离平均值超过两个偏差,重新选择tf.random_uniform(最小值,最大值)平均分布(控制字符中可加入种子,seed=n)常数生成函数:全零数组 tf.zeros(2,3,int32)全一数组tf.ones()全为给定的某数(例如 9):tf.fill(2,3,9)产生给定值得常量
8、tf.cinstant(1,2,3),with tf.Session()as sess:sess.run(weights.initializer),init=tf.initialize_all_variables()with tf.Session()as sess:sess.run(init),初始化方式,Placeholder&Feed,一个计算图可以参数化的接收外部的输入,作为一个placeholder(占位符),在计算时需要提供一个字典feed_dict来指定placeholder的取值。,input1=tf.constant(3.0)input2=tf.constant(2.0)mul
9、=tf.multiply(input1,input2)with tf.Session()as sess:result=sess.run(mul)print(result),input1=tf.placeholder(tf.float32)#占位 符 input2=tf.placeholder(tf.float32)output=tf.multiply(input1,input2)with tf.Session()as sess:print(sess.run(output,feed_dict=input1:3.0,input2:2.0),运行结果:6.0,运行结果:6.0,为什么使用计算图(Gr
10、aph),1.更加结构化的体现计算过程2.很利于我们提取中间某些节点的结果。3.更重要的是,这个图的结构天生就是方便求导,如果要求 dJ/da就只要:dj/dv*dv/da=3*1;,TensorFlow训练神经网络,三个步骤:(1)定义神经网络的结构和前向传播的输出结果;(2)定义损失函数以及选择反向传播优化的算法;(3)生成会话并且在训练数据上反复运行反向传播优化算法。,神经网络基本结构神经网络由大量神经元组成。每个神经元获得线性组合的输入,经过非线性的激活函数,然后得到非线性的输出。,神经网络激活函数,Each successive layer uses the output from
11、the previous layer as input.,线性模型的最大特点是任意线性模型的组合仍然是线性模型,只通过线性变换,任意层的全连接神经网络 和单层神经网络没有任何区别,因此非线性是深度学习的重要特性。目前TensorFlow提供了 7 种不同的非线性激活函数,常见的有、tf.sigmoid 和 tf.tanh,Hard ReLU:g(x)=max(0,x)Noise ReLU:max(0,x+N(0,(x)该函数的导函数:g(x)=0或1,ReLu(Rectified Linear Units)函数S形函数(Sigmoid Function),函数表达式和导函数:,双曲正切函数(t
12、anh),tanh(x)=2sigmoid(2x)1,但tanh 是0均值的。函数表达式:,神经网络 softmax,用于多分类神经网络输出,公式如下:,元素的Softmax值就是:,导,就是如果某一个 zj 大过其他 z,那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。为什么要取指数?第一个原因是要模拟 max 的行为,所以要让大的更大。第二个原因是需要一个可导的函数。,tensorflow:(),神经网络优化算法,为:,神经网络模型的效果和优化的目标是通过代价函数(lost function),也称 损失函数来定义的。,代价函数:,其中y为期望的输出,a为神经元实际输出
13、。,神经网络的优化算法可以分为两个阶段,第一阶段先通过前向传播算法计算得到预测值,计算损失函数。然后在第二阶段通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用 梯度下降算法 更新每一个参数。,cross_entropy=-tf.reduce_sum(y_*tf.log(y)#代价函数train_step=tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy)#梯度下降法,卷积神经网络,卷积神经网络(Convolutional Neural Network,CNN)由三部分构成。第一部分是输入层。第二部
14、分由n个 卷积层和池化层的组合组成。第三部分由一个全连结的多层感知机分类器构成。这一结构使得卷积神经网络天然适合处理二维特征数据。,卷积神经网络卷积层,对图像和滤波矩阵做内积(逐个元素相乘再求和)的操作就是所谓的卷积操作,也是卷积神经网络的名字来源。卷积的主要目的是为了从输入图像中提取特征。卷积可以 通过从输入的一小块数据中学到图像的特征,并可以保留像素间的空间关系。,filter_weight=tf.Variable(tf.truncated_normal(shape,stddev=0.1)conv=tf.nn.conv2d(x,filter_weight,strides=1,2,2,1,p
15、adding=SAME)#第1个参数对应一个输入batch;第2个参数提供卷积层的权重;第3个参数为不同维度上的步长,其中第一维和最后一维一定为1,因为卷积层的步长只对矩阵的长和宽有效;最后一个是填充方式。,卷积神经网络池化层,池化,简言之,即取区域平均或最大,如下图所示:,pool=(x,ksize=1,2,2,1,strides=1,2,2,1,padding=SAME)#参数和卷积函数类似 最大池化:,池化有两种:一种是最大池化,在选中区域中找最大的值作为抽样后的值;一种是平均值池化,把选中的区域中的平均值作为抽样后的值。,卷积神经网络dropout,Dropout 在模型训练时按照一定
16、的概率 暂时让网络某些隐含层节点的权重不工作(也称丢弃),作用是防止过拟合。TensorFlow中,可以用一个placeholder来代表 dropout 的概率。这样我们可以在训 练过程中启用dropout,在测试过程中关闭dropout。,实例代码(片段),h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)keep_prob=tf.placeholder(float)h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob),MNIST 数字识别实例,import tensorflow as tfimport
17、tensorflow.examples.tutorials.mnist.input_data as input_datafrom tensorflow.python.framework import graph_utilmnist=input_data.read_data_sets(MNIST_data,one_hot=True)#下载并加载mnist数据x=tf.placeholder(tf.float32,None,784,name=input)#输入的数据占位符y_=tf.placeholder(tf.float32,shape=None,10)#输入的标签占位符#定义一个函数,用于初始
18、化所有的权值 Wdef weight_variable(shape):initial=tf.truncated_normal(shape,stddev=0.1)return tf.Variable(initial)#定义一个函数,用于初始化所有的偏置项 bdef bias_variable(shape):initial=tf.constant(0.1,shape=shape)return tf.Variable(initial)#定义一个函数,用于构建卷积层def conv2d(x,W):return tf.nn.conv2d(x,W,strides=1,1,1,1,padding=SAME)
19、#定义一个函数,用于构建池化层def max_pool(x):return tf.nn.max_pool(x,ksize=1,2,2,1,strides=1,2,2,1,padding=SAME),#构建网络x_image=tf.reshape(x,-1,28,28,1)#转换输入数据shape,以便于用于网络中W_conv1=weight_variable(5,5,1,32)b_conv1=bias_variable(32)h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)#第一个卷积层 g(w*x+b)h_pool1=max_pool(h
20、_conv1)#第一个池化层W_conv2=weight_variable(5,5,32,64)b_conv2=bias_variable(64)h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)#第二个卷积层h_pool2=max_pool(h_conv2)#第二个池化层W_fc1=weight_variable(7*7*64,1024)b_fc1=bias_variable(1024)h_pool2_flat=tf.reshape(h_pool2,-1,7*7*64)#reshape成向量h_fc1=tf.nn.relu(tf.matmu
21、l(h_pool2_flat,W_fc1)+b_fc1)#第一个全连接层keep_prob=tf.placeholder(float,name=keep_prob)h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)#dropout层W_fc2=weight_variable(1024,10)b_fc2=bias_variable(10)y=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2,name=y)#softmax层cross_entropy=-tf.reduce_sum(y_*tf.log(y)#交叉熵trai
22、n_step=tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy)#梯度下降法correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)accuracy=tf.reduce_mean(tf.cast(correct_prediction,float)#精确度计算,输入-卷积层-池化层-卷积层-池化层-全连接(dropout)-softmax,#迭代计算sess=tf.InteractiveSession()sess.run(tf.initialize_all_va
23、riables()for i in range(40000):batch=mnist.train.next_batch(50)if i%100=0:#训练100次,验证一次 train_acc=accuracy.eval(feed_dict=x:batch0,y_:batch1,keep_prob:1.0)print(step%d,training accuracy%g%(i,train_acc)train_step.run(feed_dict=x:batch0,y_:batch1,keep_prob:0.5)#保存模型constant_graph=graph_util.convert_variables_to_constants(sess,sess.graph_def,input,keep_prob,y)with tf.gfile.FastGFile(pb/mnist.pb,mode=wb)as f:f.write(constant_graph.SerializeToString()sess.close(),