《人工智能技术开发框架》课件-第5章 深度学习框架Tensorflow_第1页
《人工智能技术开发框架》课件-第5章 深度学习框架Tensorflow_第2页
《人工智能技术开发框架》课件-第5章 深度学习框架Tensorflow_第3页
《人工智能技术开发框架》课件-第5章 深度学习框架Tensorflow_第4页
《人工智能技术开发框架》课件-第5章 深度学习框架Tensorflow_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人工智能技术开发框架计算机与软件学院第五章深度学习框架Tensorflow201AI应用开发概述02FlaskWEB应用开发03数据处理与分析工具04机器学习框架Scikit-Learn05人工智能与社会伦理深度学习框架Tensorflow2Tensorflow简介AI应用AI模型开发应用开发前端后端sk-learnTensorflow/pytorch/Modelarts/paddlepaddle(飞桨)百度、腾讯、阿里、华为等,AI开放平台(AI模型)Tensorflow简介TensorFlow起源于谷歌内部的DisBelief平台,2015年11月9日谷歌依据Apache2.0协议将其开源TensorFlow是一个非常优秀的深度神经网络机器开源平台,自发布以来受到人工智能研究者和工程师的热烈追捧,在学术界和工业界迅速得到大量应用。TensorFlow1.x经过三年多的迭代,在2018年的GoogleCloudNext上TensorFlow团队宣布开启TensorFlow2.0的迭代,2019年3月TensorFlow团队发布了TensorFlow2.0-Alpha版本,同年6月发布了TensorFlow2.0-Beta版本TensorFlow支持CPU和GPU作为计算资源。GPU运行速度快,需要NVIDA运行库支持,运行库版本:CUDA10.0CuDNN7.5.0Tensorflow1.X与Tensorflow2.X的关系Tensorflow1.x对开发者很不友好,使用难度较大,2.0版本极大改善了易用性。TensorFlow2.0在TensorFlow1.x版本上进行了大幅度改进,主要的变化如下:将Eager模式作为TensorFlow2.0默认的运行模式。Eager模式是一种命令行交互式的运行环境,不用构建Session就可以完成控制流的计算和输出,TensorFlow1.x必须构建Session删除tf.contrib库,将tf.contrib库中的高阶API和应用整合到tf.keras库下合并精简API,将TensorFlow1.x中大量重复、重叠的API进行合并精简删除全局变量,在TensorFlow2.0中不再有变量自动追踪机制,需要开发者自己实现对变量的追踪。一旦丢失对变量的追踪,变量就会被垃圾回收机制回收,不过开发者可以使用Keras对象来减轻自己的负担确立Keras的高阶API的唯一地位,在TensorFlow2.0中所有的高阶API全部集中到tf.keras库下Tensorflow2.X基本运行模式Tensorflow2.0安装:pipinstalltensorflow==2.0.0Tensorflow2.0导入:importtensorflowastfEagerExecution:动态图机制,是tensorflow2.0的默认模式。而GraphExecution:静态图机制,是tensorflow2.0之前版本的默认模式AutoGraph模式:支持Python原生的常用代码。在tensorflow1.x时代,是不支持Python很多原生的代码,如Python中的if、for语句,是tensorflow1.x所不支持的,必须使用tensorflow1.x自带的函数tf.while、tf.cond来实现,因此tensorflow1.x对Python用户并不友好,而在tensorflow2.0中使用了AutoGraph模式,支持用户使用Python原生的代码,极大地方便了用户的使用Tensorflow2.0系统架构框架分为两大部分,左边为训练部分,右边为模型部署Tensorflow2.0架构说明read&preprocessdata:使用tf.data加载数据。使用输入管道读取训练数据,支持NumPy内存数据的便捷输入,之后根据需求对数据进行预处理操作,如数据清洗、归一化等。tf.keras使用tf.keras:构建、训练并验证模型。Keras提供了几个模型构建API(Sequential、Functional)。PremadeEstimators:TensorFLow提供了很多预先写好的评估器,包括DNNClassifier,DNNRegressor,LinearClassifier,可以直接使用这些预训练的模型。TensorFlowHub:TensorFlow库,存储可重用机器学习资产的开放仓库和库,提供了许多预训练模型,可以下载并以最少的代码量在TensorFlow程序中重用这些模型,即迁移学习。distributionstrategy:使用分布式策略进行分布式训练。对于大型机器学习训练任务,分布式策略API可以轻松地在不同硬件配置上分配和训练模型,无需更改模型的定义。TensorFlow支持各种硬件加速器,如CPU,GPU和TPU,因此用户可以将训练负载分配到单节点/多加速器以及多节点/多加速器配置上。SaveModel:TensorFlow对SavedModel进行标准化,标准化的格式是一种TensorFlowLite、TensorFlow.js等格式的可互换格式。在TensorFlow2.0中,通过标准化互换格式和API来提高跨平台和组件的兼容性。TensorFlowServing:TensorFlow服务,允许通过HTTP/REST或gRPC/协议缓冲区提供模型。TensorFlowLite:TensorFlow针对移动和嵌入式设备的轻量级解决方案,能够在Android,iOS和嵌入式系统上部署模型。TensorFlow.js:允许在JavaScript环境下部署模型,如在Web浏览器或服务器端通过Node.js实现部署。TensorFlow还支持其他语言,包括C,Java,Go,C#,Rust,Julia,R等。Tensorflow2.0开发流程Tensorflow基本数据类型Tensor的概念Tensor的基本运算低阶API高阶APITensor的概念TensorFlow中的Tensor,翻译为中文就是张量,TensorFlow就是流动的张量。在一个TensorFlow程序中,所有的操作都是围绕者张量的运算、传递来进行,都是基于数据流图的计算,完成张量从数据流图的一端流动到另一端的计算过程。TensorFlow生动形象地描述了复杂数据结构在人工神经网络中的流动、传输、分析和处理模式张量(Tensor):是具有统一类型(称为dtype)的多维数组。所有张量都是不可变的,永远无法更新张量的内容,只能创建新的张量,张量有最重要的2个属性:形状shape:张量的每个维度(轴)的长度(元素数量),0维、1维、2维、3维等数据类型dtype:float32、int32、或者string等tensor的形状:0维0D张量只包含一个数字,有0个维度,又称为标量示例代码:rank_0_tensor=tf.constant(4)print(rank_0_tensor)运行结果:tf.Tensor(4,shape=(),dtype=int32)tensor的形状:1维1D张量包含一个一维数组,可以看作由0D张量组成的数组,有1个维度,又称为向量示例代码:rank_1_tensor=tf.constant([2.0,3.0,4.0])print(rank_1_tensor)运行结果:tf.Tensor([2.3.4.],shape=(3,),dtype=float32)tensor的形状:2维2D张量可以看作由1D张量组成的数组,有2个维度,又称为矩阵示例代码:rank_2_tensor=tf.constant([[1,2],[3,4],[5,6]],dtype=tf.float16)

print(rank_2_tensor)运行结果:tf.Tensor([[1.2.][3.4.][5.6.]],shape=(3,2),dtype=float16)tensor的形状:3维3D张量可以看作由2D张量组成的数组,有3个维度示例代码:rank_3_tensor=tf.constant([[[0,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]],])

print(rank_3_tensor)运行结果:tf.Tensor([[[01234][56789]]

[[1011121314][1516171819]]

[[2021222324][2526272829]]],shape=(3,2,5),dtype=int32)Tensor的基本运算标量运算向量运算矩阵运算标量运算标量运算:对张量实施逐元素运算,包括加、减、乘、除、乘方以及三角函数、指数、对数等常见函数示例代码:a=tf.constant([[1,2],[3,4]])b=tf.constant([[0,0],[1,0]])print(a+b)print(a-b)print(a*b)print(a/b)向量运算向量运算:只在一个特定轴上运算,将一个向量映射到一个标量或者另外一个向量A=tf.constant([[2,20,30,3,6],[1,1,1,1,1]])print(tf.math.reduce_sum(A))print(tf.math.reduce_max(A))B=tf.constant([[2,20,30,3,6],[3,11,16,1,8],[14,45,23,5,27]])print(tf.math.reduce_sum(B,0))#沿0轴(列方向),求和print(tf.math.reduce_sum(B,1))#沿1轴(行方向),求和print(tf.math.reduce_max(B,0))#沿0轴,求最大值print(tf.math.reduce_max(B,1))#沿1轴,求最大值矩阵运算矩阵运算:矩阵必须是二维的,包括矩阵乘法、矩阵转置、矩阵逆、矩阵行列式、矩阵求特征值、矩阵分解等运算#矩阵转置

A_trans=tf.linalg.matrix_transpose(A)

print(A_trans)

#矩阵点积

print(tf.linalg.matmul(B,A_trans))A=tf.constant([[2,20,30,3,6],[1,1,1,1,1]])B=tf.constant([[2,20,30,3,6],[3,11,16,1,8],[14,45,23,5,27]])低阶APItf.constant():提供了常量的声明功能tf.Variable():提供了变量的声明功能tf.reshape():提供了多阶Tensor的形状变换功能tf.math.reduce_mean():提供了对Tensor求平均值的功能tf.random.normal():随机生成一个Tensor,其值符合正态分布tf.random.uniform():随机生成一个Tensor,其值符合均匀分布tf.transpose():提供了矩阵的转置功能tf.math.argmax():提供了返回一个数组内最大值对应索引的功能tf.expand_dims():在输入的Tensor中增加一个维度tf.concat():将多个Tensor在同一个维度上进行连接tf.bitcast():提供了数据类型转换功能tf.constant()tf.constant():提供了常量的声明功能示例代码:a=tf.constant(7)print(a)print(a.numpy())tf.Variable()tf.Variable():提供了变量的声明功能示例代码:#声明一个Python变量a1=7#声明一个0阶Tensor变量a2=tf.Variable(7)#声明一个1阶Tensor变量,即数组a3=tf.Variable([0,1,2])print(a1,a2,a3)tf.reshape()tf.reshape():提供了多阶Tensor的形状变换功能示例代码:a=tf.Variable([[0,1,2],[3,4,5]])print(a)#对a的形状进行变换,变换为(3,2)a1=tf.reshape(a,[3,2])print(a1)print(a1.shape)tf.math.reduce_mean()tf.math.reduce_mean():提供了对Tensor求平均值的功能,输出数据类型会根据输入数据类型来确定。使用该API时可以配置的参数如下:input_tensor:配置输入的Tensoraxis:配置按行求平均值或按列求平均值,默认是全行全列求平均值keepdims:配置输出结果是否保持二维矩阵特性name:配置操作的名称示例代码:a=tf.constant([1,2.,3,4,5,6,7.])#输入数据类型是float32,输出数据类型也是float32print(a.dtype)print(tf.math.reduce_mean(a))b=tf.constant([[1,2,1],[5,2,10]])#输入数据类型是int32,输出数据类型也是int32print(b.dtype)#虽然平均值为3.5,但是由于上面确定了输出类型为整型,因此强制赋值为整数3print(tf.math.reduce_mean(b))tf.random.normal()tf.random.normal():随机生成一个Tensor,其值符合正态分布。使用该API时有如下参数需要配置:shape:配置生成Tensor的维度mean:配置正态分布的中心值stddev:配置正态分布的标准差seed:配置正态分布的随机生成粒子dtype:配置生成Tensor的数据类型示例代码:a=tf.random.normal(shape=[2,3],mean=2)print(a)#a为Tensor类型,是一个2维张量Tensorprint(type(a))#type()方法是Python的原生方法,查看Tensor对象a的类型,是一个Tensorprint(a.dtype)#由于a是Tensor类型,因此可以使用Tensor对象的dtype属性print(a.numpy())#a转换成numpy的array数组类型,就是普通的数组类型print(type(a.numpy()))tf.random.uniform()tf.random.uniform():随机生成一个Tensor,其值符合均匀分布。使用该API时有如下参数需要配置:shape:配置生成Tensor的维度minval:配置随机生成数值的最小值maxval:配置随机生成数值的最大值seed:配置正态分布的随机生成粒子dtype:配置生成Tensor的数据类型示例代码:a=tf.random.uniform(shape=[2,3],minval=1,maxval=10,seed=8,dtype=32)print(a.numpy())tf.transpose()tf.transpose():提供了矩阵的转置功能。使用该API时配置的参数如下:a:输入需要转置的矩阵perm:配置转置后矩阵的形状conjugate:当输入矩阵是复数时,需要配置为Truename:配置本次操作的名称示例代码:#定义x为一个3维张量,形状是(2,2,3)x=tf.constant([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])#转置后的形状是(2,3,2)a=tf.transpose(x,perm=[0,2,1])print(a.numpy())tf.transpose(a,perm=[dimension_1,dimenaion_2,..,dimension_n]):dimension_n是整数,每个数对应相应的维度,用0,1,2来表示。这个函数主要适用于交换输入张量的不同维度用的。如果a是二维,就相当是转置。如果a是三维,那么perm=[2,1,0],就把输入张量的第三维度和第一维度交换。tf.math.argmax()tf.math.argmax():提供了返回一个数组内最大值对应索引的功能。使用该API时有如下参数可以配置:input:配置输入的数组axis:配置计算的维度output_type:配置输出的格式name:配置操作的名称示例代码:a=tf.constant([1,2,3,4,5])x=tf.math.argmax(a)print(x.numpy())tf.expand_dims()tf.expand_dims():在输入的Tensor中增加一个维度,比如t是一个维度为[2]的Tensor,那么tf.expand_dims(t,0)的维度就会变成[1,2]。使用这个API时需要配置如下参数:input:配置输入的Tensoraxis:配置需要添加维度的下标,比如[2,1]需要在2和1之间添加,则配置值为1name:配置输出Tensor的名称示例代码:#初始化一个维度为(3,1)的Tensora=tf.constant([[1],[2],[3]])print(a.shape)print(a)#为a增加一个维度,使其维度变成(1,3,1)b=tf.expand_dims(a,0)print(b.shape)print(b)tf.concat()tf.concat():将多个Tensor在同一个维度上进行连接,使用该API时需要进行如下参数配置:values:配置Tensor的列表或者是一个单独的Tensoraxis:配置按行或按列连接,axis=0表示按行连接,axis=1表示按列连接name:配置运算操作的名称示例代码:a1=tf.constant([[2,3,4],[4,5,6],[2,3,4]])a2=tf.constant([[1,2,2],[6,7,9],[2,3,2]])#按行进行连接b=tf.concat([a1,a2],axis=0)print(b.numpy())tf.bitcast()tf.bitcast():提供了数据类型转换功能,使用该API时需要进行如下参数配置:input:配置需要进行类型转换的Tensor,Tensor的类型可以为bfloat16,half,float32,float64,int64,int32,uint8,uint16,uint32,uint64,int8,int16,complex64,complex128,qint8,quint8,qint16,quint16,qint32type:配置转换后的数据类型,可以选择的类型包括tf.bfloat16,tf.half,tf.float32,tf.float64,64,32,tf.uint8,tf.uint16,tf.uint32,tf.uint64,8,16,plex64,plex128,tf.qint8,tf.quint8,tf.qint16,tf.quint16,tf.qint32name:配置运算操作的名称示例代码:#a原本是浮点类型float32类型a=tf.constant(32.0)#将a转换成整型int32b=tf.bitcast(a,type=32)print(a.dtype)print(b.dtype)Tensorflow高阶API(tf.keras)Tensorflow2官方API参考://post/tf2doc.html高阶API指的是对TensorFlow低阶API的进一步高层封装,tf.keras是TensorFlow的高阶API,使用方法为tf.keras.API。高阶API是对低阶API的高层封装,调用高阶API后,底层执行的仍然是低阶API能力在TensorFlow2.0版本中,官方推荐的高阶API只有tf.keras。Keras是一个意在降低机器学习编程入门门槛的项目,其在业界拥有众多的拥护者和使用者。经过Keras社区的多年发展,Keras集成了很多符合工业和研究需求的高阶API,使用这些API只需要几行代码就可以构建和运行一个非常复杂的神经网络tf.keras常用高阶APIactivations:tf.keras.activations中包含了当前主流的激活函数(目的:非线性变换)applications:tf.keras.applications中包含的是已经进行预训练的神经网络模型,可以直接进行预测或者迁移学习backend:tf.keras.backend中包含了Keras后台的一些基础API接口datasets:tf.keras.datasets中包含了常用的公开数据训练集layers:tf.keras.layers中包含了已经定义好的常用的神经网络层(卷积层、池化层、全连接层、激活层、正则化层、Dropout层等)losses:tf.keras.losses中包含了常用的损失函数optimizers:tf.keras.optimizers中包含了主流的优化器(求取模型的最优训练参数,注意不是超参数)preprocessing:tf.keras.preprocessing中包含了数据处理的一些方法regularizers:tf.keras.regularizers中提供了常用的正则化方法(防止过拟合),包括L1、L2等正则化方法Sequential:tf.keras.Sequential将神经网络层进行线性组合形成神经网络结构。Sequential是一个方法类,可以轻而易举地以堆叠神经网络层的方式集成构建一个复杂的神经网络模型。Sequential提供了丰富的方法,利用这些方法可以快速地实现神经网络模型的网络层级集成、神经网络模型编译、神经网络模型训练和保存,以及神经网络模型加载和预测深度学习的基本流程模型加载模型保存模型测试模型训练模型构建数据预处理数据采集和标注模型应用Tensorflow关键步骤(1)模型搭建:两种模型搭建的方法(1)Sequential编程方法(2)函数式API编程方法模型创建:model=tf.keras.Sequential()模型编译:tf.keras.Sequential().compile(),即:pile()。只有编译后才能对神经网络模型进行训练。对神经网络模型进行编译是将高阶API转换成可以直接运行的低阶API,理解时可以类比高级开发语言的编译模型训练:tf.keras.Sequential.fit(),即:model.fit()模型保存:tf.keras.Sequential.save(),即:model.save()模型加载:model=tf.keras.models.load_model()模型预测:tf.keras.Sequential.predict(),即:model.predict()Tensorflow关键步骤(2)在模型搭建中,有两种主要方法:Sequential方法、函数式API方法:Sequential方式:顺序式编程,使用add()方法添加网络层。该方法适用于简单的网络,属于低级编程模式函数式API方式:自由度更大的编程方式,使用API函数添加网络层,适用于复杂网络构建,属于高级编程模式,能够实现Sequential方式无法胜任的复杂网络构建本章先以Sequential方法为例,完整介绍Tensorflow深度学习过程,最后在实战案例中介绍函数式API方法。这两种方法的区别只是体现在模型构建方面,是构建模型的方法差异,而在模型训练、保存、加载、预测、应用等方面的使用时完全一样的。模型创建(Sequential方法):实例化模型对象首先要创建一个模型对象的实例,方法是:tf.keras.Sequential(),返回值为模型的实例model,之后可以对该model进行一系列的操作示例代码:importtensorflowastf#创建模型对象的实例model=tf.keras.Sequential()模型创建(Sequential方法):组建网络层使用Sequential().add()方法来实现神经网络层级的集成,可以根据实际需要将tf.keras.layers中的各类神经网络层级添加进去。Sequential().add()方法的返回值是模型对象本身,即添加了新的一层之后的model对象,即更新了model对象示例代码:实现三个全连接神经网络层级的集成,构建一个全连接神经网络模型importtensorflowastf#创建模型对象的实例model=tf.keras.Sequential()#使用add()方法集成神经网络层级model.add(tf.keras.layers.Dense(256,activation="relu"))model.add(tf.keras.layers.Dense(128,activation="relu"))model.add(tf.keras.layers.Dense(2,activation="softmax"))模型编译在完成神经网络层级的集成之后需要对神经网络模型进行编译,只有编译后才能对神经网络模型进行训练。对神经网络模型进行编译是将高阶API转换成可以直接运行的低阶API,理解时可以类比高级开发语言的编译Sequential().compile():提供了神经网络模型的编译功能,需要定义三个参数:loss:用来配置模型的损失函数,可以通过名称调用tf.lossesAPI中已经定义好的loss函数optimizer:用来配置模型的优化器,可以调用tf.keras.optimizersAPI配置模型所需要的优化器metrics:用来配置模型评价的方法,如accuracy、mse等示例代码:#编译模型pile(loss="sparse_categorical_crossentropy",optimizer=tf.keras.optimizers.Adam(0.01),metric=["accuracy"])模型训练神经网络模型编译后,可以使用准备好的训练数据对模型进行训练Sequential().fit():提供了神经网络模型的训练功能,主要的配置参数如下:x:配置训练的输入数据,可以是array或者tensor类型y:配置训练的标注数据,可以是array或者tensor类型batch_size:配置批大小,默认值是32epochs:配置训练的epochs的数量verbose:配置训练过程信息输出的级别,共有三个级别,分别是0、1、2。0代表不输出任何训练过程信息;1代表以进度条的方式输出训练过程信息;2代表每个epoch输出一条训练过程信息validation_split:配置验证数据集占训练数据集的比例,取值范围为0~1validation_data:配置验证数据集。如果已经配置validation_split参数,则可以不配置该参数。如果同时配置validation_split和validation_data参数,那么validation_split参数的配置将会失效shuffle:配置是否随机打乱训练数据。当配置steps_per_epoch为None时,本参数的配置失效。initial_epoch:配置进行fine-tune时,新的训练周期是从指定的epoch开始继续训练的steps_per_epoch:配置每个epoch训练的步数模型保存使用save()或者save_weights()方法保存并导出训练得到的模型,在使用这两个方法时需要分别配置以下参数:模型加载和预测当需要使用模型进行预测时,可以使用tf.keras.models中的load_model()方法重新加载已经保存的模型文件。在完成模型文件的重新加载之后,可以使用predict()方法对数据进行预存输出。在使用这两个方法时需要分别进行如下参数配置:示例代码:#模型加载model=tf.keras.models.load_model(filepath)#模型预测model.predict(x)卷积神经网络的图像识别实战案例本案例使用Tensorflow实现一个卷积神经网络模型,实现图像识别的功能,并通过一个WEB应用程序来使用图像识别功能。本案例涉及到3个方面的知识和内容:图像处理:使用Python的图像处理工具PIL库来进行图像处理方面的工作图像识别模型:使用Tensorflow实现卷积神经网络模型,并进行图像识别工作WEB应用开发:使用Flask开发图像识别的WEB应用程序Python图像处理工具PILPIL是PythonImagingLibrary的简称,是Python生态系统中图像处理的标准库,其功能非常强大且API非常简单、易用,因此深受欢迎。除了PIL之外,常用的图像处理工具是OpenCV库PIL库需要先安装后使用。使用PIL时需要导入PIL包,并使用PIL中的Image类实现图像的基本操作:fromPILimportImagePIL的基本功能:图像读写图像编辑图像读写使用Image类进行图像的读写:读取图像:Image.open()图像保存:Image.save()读取图像Image.open():提供了打开图像文件和读取图像数据的功能示例代码:fromPILimportImagewithopen("test.jpg","rb")asfp:im=Image.open(fp)#打开图片文件,将图片数据保存到im对象中去图像保存Image.save():提供了图像数据的保存功能,可以保存成训练所需要的图像格式示例代码:fromPILimportImageimportos,sysinfile="test.jpg"f,e=os.path.splitext(infile)outfile=f+".png"ifinfile!=outfile:

try:Image.open(infile).save(outfile)exceptIOError:print("cannotconvert",infile)图像编辑使用Image类进行图像的编辑:图像截取:crop()图像尺寸变换:resize()像素变换:convert()图像截取在实际业务场景中,由于所获得的图像尺寸可能是不一样的,而在进行训练时需要数据维度是固定的,因此,在进行训练前需要对数据进行预处理crop():提供了对图像进行截取以保持图像的尺寸统一的功能示例代码:fromPILimportImage#读取图像数据im=Image.open("test.jpg")#初始化截取图像的范围box=(100,100,400,400)#截取的范围是:左上角坐标(100,100),右下角坐标(400,400),截取矩形#完成图像的截取并保存图像im.crop(box).save("crop.jpeg")图像尺寸变换resize():提供了图像尺寸变换功能,可以按照需要变换源图像的尺寸示例代码:fromPILimportImage#读取图像数据im=Image.open("test.jpg")#改变图片尺寸为(宽,高),并保存im.resize((500,400)).save("resize.jpeg")像素变换convert():对图像进行二值化处理。这个API提供了将图像进行像素色彩模式转换的功能,可以在支持的像素色彩格式间进行转换。在人工智能算法编程中常用的是将RGB模式进行二值化操作示例代码:fromPILimportImage#读取图像数据im=Image.open("test.jpg")#将彩色图片转换成灰度图像im.convert("L").save("convert.jpeg")CIFAR-10数据集介绍CIFAR-10是由Hinton的学生AlexKrizhevsky和IlyaSutskever整理的一个用于识别普适物体的小型数据集。它一共包含10个类别的RGB彩色图片:飞机(airplane)、汽车(automobile)、鸟类(bird)、猫(cat)、鹿(deer)、狗(dog)、蛙类(frog)、马(horse)、船(ship)和卡车(truck)。图片的尺寸为32×32,数据集中一共有50000张训练图片和10000张测试图片。CIFAR-10数据集下载地址:/~kriz/cifar.htmlCIFAR-10数据集分析说明CIFAR-10数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。其中50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图每个batch文件包含一个字典,每个字典包含有:Data:一个10000*3072的numpy数组,数据类型是无符号整形uint8。这个数组的每一行存储了32*32大小的彩色图像(32*32*3通道=3072)。前1024个数是red通道,然后分别是green,blue。图像以行的顺序存储,也就是说前32个数就是这幅图的像素矩阵的第一行labels:一个范围在0-9的含有10000个数的列表(一维的数组)。第i个数就是第i个图像的类标数据集除了6个batch之外,还有一个文件batches.meta。它包含一个python字典对象,内容有:一个包含10个元素的列表,每一个描述了labelsarray中每个数字对应类标的名字。比如:label_names[0]=="airplane",label_names[1]=="automobile"实战练习:将CIFAR数据集转换保存为JPG图片本案例作为课堂实战案例Tensorflow构建卷积神经网络(CNN)卷积神经网络(CNN)主要用于计算机视觉,如图像、视频类的应用,主要有以下的层次构成:数据输入层:主要是对原始图像数据进行预处理。预处理方式:去均值、归一化、PCA卷积层:卷积层通过卷积计算将样本数据进行降维采样,以获取具有空间关系特征的数据激活层:激活层对数据进行非线性变换处理,目的是对数据维度进行扭曲来获得更多连续的概率密度空间。在CNN中,激活层一般采用的激活函数是ReLU,它具有收敛快、求梯度简单等特点池化层:池化层夹在连续的卷积层中间,用于压缩数据的维度以减少过拟合压平层:将输入该层级的数据压平,不管输入数据的维度数是多少,都会被压平成一维全连接层:和常规的DNN一样,全连接层在所有的神经网络层级之间都有权重连接,最终连接到输出层。在进行模型训练时,神经网络会自动调整层级之间的权重以达到拟合数据的目的Dropout层(失活):Dropout的工作机制就是每步训练时按照一定的概率随机使神经网络的神经元失效,这样可以极大降低连接的复杂度。同时由于每次训练都是由不同的神经元协同工作的,这样的机制也可以很好地避免数据带来的过拟合,提高了神经网络的泛化性Adam:Adam是一种可以替代传统随机梯度下降算法的梯度优化算法数据输入层输入层就是图像数据的输入,不需要特定的处理函数API,就是tensor的输入。tensor:(高度,宽度,通道数),例如:(32,32,3)卷积层tf.keras.layers.Conv2D():构建卷积层对象。使用Conv2D可以创建一个卷积核来对输入数据进行卷积计算,然后输出结果,其创建的卷积核可以处理二维数据。依此类推,Conv1D可以用于处理一维数据,Conv3D可以用于处理三维数据。在进行神经网络层级集成时,如果使用该层作为第一层级,则需要配置input_shape参数。在使用Conv2D时,需要配置的主要参数如下:filters:配置输出数据的维度,数值类型是整型,等于卷积核的数量,该参数人工设定,可以调参kernel_size:配置卷积核的大小。这里使用的是二维卷积核,因此需要配置卷积核的长和宽。数值是包含两个整型元素值的列表或者元组strides:配置卷积核在做卷积计算时移动步幅的大小,分为X、Y两个方向的步幅。数值是包含两个整型元素值的列表或者元组,当X、Y两个方向的步幅大小一样时,只需要配置一个步幅即可padding:配置图像边界数据处理策略。SAME表示补零,VALID表示不进行补零。在进行卷积计算或者池化时都会遇到图像边界数据处理的问题,当边界像素不能正好被卷积或者池化的步幅整除时,只能在边界外补零凑成一个步幅长度,或者直接舍弃边界的像素特征data_format:配置输入图像数据的格式,默认格式是channels_last,也可以根据需要设置成channels_first。图像数据的格式分为channels_last(batch,height,width,channels)和channels_first(batch,channels,height,width)两种,其中batch代表数据集中图片的数量dilation_rate:配置使用扩张卷积时每次的扩张率activation:配置激活函数,如果不配置则不会使用任何激活函数use_bias:配置该层的神经网络是否使用偏置向量kernel_initializer:配置卷积核的初始化,即采用什么方法或者算法创建卷积核矩阵bias_initializer:配置偏置向量的初始化,即采用什么方法或者算法创建偏置向量激活层激活层对数据进行非线性变换处理,目的是对数据维度进行扭曲来获得更多连续的概率密度空间。在CNN中,激活层一般采用的激活函数是ReLU,它具有收敛快、求梯度简单等特点池化层tf.keras.layers.MaxPool2D():MaxPool2D的作用是对卷积层输出的空间数据进行池化,采用的池化策略是最大值池化。在使用MaxPool2D时需要配置的参数如下:pool_size:配置池化窗口的维度,包括长和宽。数值是包含两个整型元素值的列表或者元组strides:配置卷积核在做池化时移动步幅的大小,分为X、Y两个方向的步幅。数值是包含两个整型元素值的列表或者元组,默认与pool_size相同padding:配置处理图像数据进行池化时在边界补零的策略。SAME表示补零,VALID表示不进行补零。在进行卷积计算或者池化时都会遇到图像边界数据的问题,当边界像素不能正好被卷积或者池化的步幅整除时,就只能在边界外补零凑成一个步幅长度,或者直接舍弃边界的像素特征data_format:配置输入图像数据的格式,默认格式是channels_last,也可以根据需要设置成channels_first。在进行图像数据处理时,图像数据的格式分为channels_last(batch,height,width,channels)和channels_first(batch,channels,height,width)两种压平层tf.keras.layers.Flatten():Flatten将输入该层级的数据压平,不管输入数据的维度数是多少,都会被压平成一维。这个层级的参数配置很简单,只需要配置data_format即可:data_format:可被设置成channels_last或channels_first,默认值是channels_last全连接层tf.keras.layer.Dense():Dense提供了全连接的标准神经网络,配置参数如下:units:正整数,输出空间的维数activation:使用的激活函数use_bias:布尔值,是否使用偏置向量kernel_initializer:配置kernel权重矩阵的初始化器,这里的kernel是指权重w,即y=wx+b中的wbias_initializer:配置偏置向量的初始化器,这里的bias是指偏置b,即y=wx+b中的bkernel_regularizer:应用于kernel权重矩阵的正则化函数bias_regularizer:应用于偏置向量正则化函数activity_regularizer:应用于本层输出数据上的正则化函数kernel_constraint:应用于kernel权重矩阵的约束函数bias_constraint:应用于偏置向量的约束函数Dropout层tf.keras.layers.Dropout():对于Dropout在神经网络模型中具体作用的认识,业界分为两派,其中一派认为Dropout极大简化了训练时神经网络的复杂度,加快了神经网络的训练速度;另一派认为Dropout的主要作用是防止神经网络的过拟合,提高了神经网络的泛化性。简单来说,Dropout的工作机制就是每步训练时按照一定的概率随机使神经网络的神经元失效,这样可以极大降低连接的复杂度。同时由于每次训练都是由不同的神经元协同工作的,这样的机制也可以很好地避免数据带来的过拟合,提高了神经网络的泛化性。在使用Dropout时,需要配置的参数如下:rate:配置神经元失效的概率noise_shape:配置Dropout的神经元seed:生成随机数Adamtf.keras.optimizers.Adam():Adam是一种可以替代传统随机梯度下降算法的梯度优化算法,适用于解决神经网络训练中的高噪声和稀疏梯度问题,它的超参数简单、直观并且只需要少量的调参就可以达到理想的效果。官方推荐的最优参数组合为(alpha=0.001,beta_1=0.9,beta_2=0.999,epsilon=10E-8),在使用时可以配置如下参数:learning_rate:配置学习率,即上面的参数alpha,默认值是0.001beta_1:配置一阶矩估计的指数衰减率,默认值是0.9beta_2:配置二阶矩估计的指数衰减率,默认值是0.999epsilon:该参数是一个非常小的数值,防止出现除以零的情况,默认值是10E-8amsgrad:配置是否使用AMSGrad,这是一种改进的Adam优化器算法name:配置优化器的名称Tensorflow构建模型的两种方法在模型搭建中,有两种主要方法:Sequential方式:顺序式编程,使用add()方法添加网络层。该方法适用于简单的网络,属于低级编程模式。函数式API方式:自由度更大的编程方式,使用API函数添加网络层,适用于复杂网络构建,属于高级编程模式,能够实现Sequential方式无法胜任的复杂网络构建。本章使用两种方法构建CNN网络模型CNN网络结构Layer(type) OutputShape==============================================conv1(Conv2D) (None,32,32,64)_________________________________________________________________________conv2(Conv2D) (None,32,32,64)________________________________________________________________________pool1(MaxPooling2D) (None,16,16,64)_________________________________________________________________________d1(Dropout) (None,16,16,64)_________________________________________________________________________batch_normalization (None,16,16,64)_________________________________________________________________________conv3(Conv2D) (None,16,16,128)_________________________________________________________________________conv4(Conv2D) (None,16,16,128)_________________________________________________________________________pool2(MaxPooling2D) (None,8,8,128)_________________________________________________________________________d2(Dropout) (None,8,8,128)_________________________________________________________________________batch_normalization_1 (Batch(None,8,8,128)_________________________________________________________________________conv5(Conv2D) (None,8,8,256)_________________________________________________________________________conv6(Conv2D) (None,8,8,256)_________________________________________________________________________pool3(MaxPooling2D) (None,4,4,256)_________________________________________________________________________d3(Dropout) (None,4,4,256)_________________________________________________________________________batch_normalization_2 (Batch(None,4,4,256)_________________________________________________________________________flatten(Flatten) (None,4096)_________________________________________________________________________dropout(Dropout

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论