版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章深度学习基础微课视频PaddlePaddle主讲人:钱彬、朱会杰内容安排深度学习概述01.环境安装02.PaddlePaddle基础03.PaddlePaddle实现机器学习:线性回归投资预测04.PaddlePaddle实现深度学习:自动驾驶小车控制05.PART01深度学习概述深度学习概述----人工智能、机器学习和深度学习01人工智能(ArtificialIntelligence,AI)是最宽泛的概念,是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。机器学习(MachineLearning,ML)是当前比较有效的一种实现人工智能的方式。深度学习(DeepLearning,DL)则是机器学习算法中最热门的一个分支,近些年取得了显著的进展,并替代了大多数传统机器学习算法。深度学习概述----
深度学习起源和发展01最早的神经网络数学模型来自于由心理学家McCulloch教授和数学家Pitts教授于1943年提出的模拟人类大脑神经元的McCullochPitt神经元模型,该模型被称为M-P模型。M-P模型被称为人工神经网络的起点,随后出现的神经网络模型均是以该模型为基础的。发展历程深度学习概述----
深度学习起源和发展01发展历程1943年心理学家McCulloch教授和数学家Pitts教授提出的模拟大脑神经元的模型M-P模型被称为人工神经网络的起点1958年感知机模型神经网络研究进入了第一次高潮期1986年反向传播算法进一步发展无法有效的训练深层网络支持向量机2006年《科学》上提出了深度置信网络模型开启了深度神经网络浪潮错误率从26%降到了15%2022年OpenAI公司推出ChatGPT3.52024年初,人工智能文生视频大模型sora深度学习概述----深度学习框架01国外深度学习框架PyTorch(脸书)TensorFlow(谷歌)MXNet(亚马逊)国内深度学习框架PaddlePaddle(百度)MindSpore(华为)PaddlePaddle是百度自主研发的国产深度学习框架,于2016年正式开源推出。相比国内其他框架,其开源最早,社区也更活跃。目前,PaddlePaddle更新到版本2系列,全面支持动态图编程模式,其API与PyTorch非常相近,可以非常方便的在PyTorch和PaddlePaddle之间进行转换PART02环境安装环境安装----安装说明02深度学习的训练和推理需要特定的硬件环境才能满足运算需求,尤其是深度学习训练任务,一般需要GPU环境支持CUDACUDA是英伟达利用GPU平台进行通用并行计算的一种架构,它包含了CUDA指令集架构以及GPU内部的并行计算引擎CUDNN专门用于深度神经网络的SDK库来加速完成相关特定的深度学习操作NCCL是一个实现多GPU通信的软件库,单GPU和Windows系统不需要环境安装----Windows平台02安装英伟达显卡驱动1.Nvidia官网确定显卡是否支持,如果支持则安装驱动2.通过nvidia-smi查看支持的最高版本以及检验是否安装成功环境安装----Windows平台02安装CUDA1.PaddlePaddle官网确认可以使用的CUDA版本环境安装----Windows平台02安装CUDA2.英伟达CUDA官网下载对应版本的CUDA3.测试一下CUDA是否安装成功nvcc-V环境安装----Windows平台02安装CUDNN1.
CUDNN官方下载安装文件2.文件拷贝解压缩,将CUDNN压缩包里面的bin、include、lib文件直接复制到CUDA的安装目录下(C:\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v11.8),直接覆盖替换即可环境安装----Windows平台02安装PaddlePaddle1.
PaddlePaddle官网选择好版本以后会自动给出对应的安装命令,使用对应命令安装2.检验是否安装成功importpaddlepaddle.utils.run_check()python-mpipinstallpaddlepaddle-gpu==3.0.0b1-i/packages/stable/cu118/环境安装----Ubuntu平台02安装英伟达显卡驱动nvidia-smi1.检测NVIDIA图形显卡和推荐的驱动程序,在终端输入ubuntu-driversdevices2.根据推荐的显卡驱动包进行安装,具体可以使用类似下面的命令进行安装sudoapt-getinstallnvidia-driver-5353.安装完成后重启系统,然后在终端中输入命令环境安装----Ubuntu平台02安装CUDAsudoshcuda_11.8.0_520.61.05_linux.run1.PaddlePaddle官网确认适配的CUDA版本2.英伟达CUDA官网下载对应版本的CUDA,InstallerType选项上选择runfile[local]3.安装命令如下注意:安装时将驱动Driver选项去掉环境安装----Ubuntu平台02安装CUDAexportPATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}exportLD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}4.配置环境变量sudogedit~/.bashrc然后在打开的文件末尾添加代码(这里版本为11.8):exportLD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH如果是基于WindowsWSL的Ubuntu双系统,还需要增加:source~/.bashrc保存修改后,使用下面的命令更新环境变量环境安装----Ubuntu平台02安装CUDA5.检查安装信息nvcc-V正常情况输出:环境安装----Ubuntu平台02安装CUDNN1.下载CUDNN,选择LocalInstallerforLinuxx86_64(Tar),版本需遵从PaddlePaddle要求tar-xfcudnn-linux-x86_64-0_cuda11-archive.tar.xzcdcudnn-linux-x86_64-0_cuda11-archivesudocplib/*/usr/local/cuda-11.8/lib64/sudocpinclude/*/usr/local/cuda-11.8/include/2.解压并拷贝:环境安装----Ubuntu平台02安装CUDNN1.下载CUDNN,选择LocalInstallerforLinuxx86_64(Tar),版本需遵从PaddlePaddle要求tar-xfcudnn-linux-x86_64-0_cuda11-archive.tar.xzcdcudnn-linux-x86_64-0_cuda11-archivesudocplib/*/usr/local/cuda-11.8/lib64/sudocpinclude/*/usr/local/cuda-11.8/include/2.解压并拷贝,注意修改为自己的版本环境安装----Ubuntu平台02安装CUDNN3.检验安装版本cat/usr/local/cuda-11.8/include/cudnn_version.h|grepCUDNN_MAJOR-A2环境安装----Ubuntu平台02安装NCCL,如果您的GPU大于1张1.NCCL下载选择NCCL2.16.5forCUDA11.8,展开后单击O/Sagnosticlocalinstaller选项进行下载2.解压与拷贝,注意更换为自己电脑版本tar-xfnccl_2.16.5-1+cuda11.8_x86_64.txzcdnccl_2.16.5-1+cuda11.8_x86_64sudocpinclude/nccl*.h/usr/local/cuda/includesudocp-rlib/*/usr/local/cuda/lib64环境安装----Ubuntu平台02安装PaddlePaddle,与Windows系统安装方法一致1.
PaddlePaddle官网选择好版本以后会自动给出对应的安装命令,使用对应命令安装2.检验是否安装成功importpaddlepaddle.utils.run_check()python-mpipinstallpaddlepaddle-gpu==3.0.0b1-i/packages/stable/cu118/2张显卡会显示PaddlePaddleworkswellon2GPUs环境安装----AIStudio平台02AIStudio是基于PaddlePaddle的人工智能学习社区,提供了在线编程环境,可以免费使用多种GPU资源1.注册和登录2.创建项目,IDE可选Jupyter和VSCode
参照官网说明,可免费使用GPU资源环境安装----AIStudio平台02AIStudio是基于PaddlePaddle的人工智能学习社区,提供了在线编程环境,可以免费使用多种GPU资源3.运行项目
选择合适的GPU或CPU资源环境安装----AIStudio平台02AIStudio是基于PaddlePaddle的人工智能学习社区,提供了在线编程环境,可以免费使用多种GPU资源4.Folk项目在AIStudio上有众多开发者开发的项目,这些项目大部分都是开源的。读者如果喜欢某个项目,那么可以在AIStudio上直接Folk别人的项目,此时会同步该项目运行时所需要的完整环境和代码,Folk完以后可以直接运行别人的项目而无需担心环境不一致。PART03PaddlePaddle基础PaddlePaddle基础----Tensor表示03Tensor,中文意思是张量,其概念可以类比Numpy中的ndarray,本质上就是一个带梯度信息的多维数组,是深度学习中数据表示的最基本形式importpaddletensor_empty=paddle.empty(shape=[5,3],dtype='float32')print(tensor_empty)构建一个5×3的Tensor(demo/demo1.py)输出结果(如果是CPU环境,输出结果略有区别)如下:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])PaddlePaddle基础----Tensor表示03Tensor,中文意思是张量,其概念可以类比Numpy中的ndarray,本质上就是一个带梯度信息的多维数组,是深度学习中数据表示的最基本形式importpaddletensor_empty=paddle.empty(shape=[5,3],dtype='float32')print(tensor_empty)构建一个5×3的Tensor(demo/demo1.py)输出结果(如果是CPU环境,输出结果略有区别)如下:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])包括了shape、dtype、place、stop_gradient等信息PaddlePaddle基础----Tensor表示03paddle.ones()和paddle.zeros()也是常用的Tensor初始化函数tensor_ones=paddle.ones([2,3])print(tensor_ones)tensor_zeros=paddle.zeros([2,3])print(tensor_zeros)paddle.zeros()用于创建元素值全为0的Tensor输出结果为:Tensor(shape=[2,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[1.,1.,1.],[1.,1.,1.]])Tensor(shape=[2,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.,0.,0.],[0.,0.,0.]])PaddlePaddle基础----Tensor表示03paddle.rand()和paddle.randn()是两个常用的随机初始化函数tensor_rand=paddle.rand([5,3])print(tensor_rand)paddle.rand()用于生成服从区间[0,1)均匀分布的随机Tensor输出结果为:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.68210554,0.76153767,0.44551539],[0.69805700,0.31456539,0.98931015],[0.43727642,0.31598026,0.48267344],[0.32874393,0.75220251,0.13546221],[0.05477471,0.40740317,0.67578572]])PaddlePaddle基础----Tensor表示03tensor_randn=paddle.randn([5,3])print(tensor_randn)paddle.randn()用于生成服从均值为0、方差为1正态分布的随机Tensor输出结果为:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[-0.82212120,-1.80854058,-0.67530596],[0.03965529,0.87011033,0.44460696],[-0.13173500,-0.23574546,0.13501364],[-0.09552619,-0.36920878,-0.48894903],[0.98790330,1.57164097,0.45782539]])PaddlePaddle基础----Tensor表示03tensor_x=paddle.to_tensor([5.5,4,8.7,9])print(tensor_x)Python的List列表转化为Tensor输出结果为:Tensor(shape=[4],dtype=float32,place=Place(gpu:0),stop_gradient=True,[5.50000000,4.,8.69999981,9.])直接用现有数据进行Tensor初始化PaddlePaddle基础----Tensor表示03importpaddleimportnumpyasnpx=np.ones([2,3])y=paddle.to_tensor(x)print(y)Numpy数组转化为Tensor(demo/demo2.py)直接用现有数据进行Tensor初始化输出结果为:Tensor(shape=[2,3],dtype=float64,place=Place(gpu:0),stop_gradient=True,[[1.,1.,1.],[1.,1.,1.]])如果更为:y=paddle.to_tensor(x,dtype=paddle.float32),则输出的类型为float32PaddlePaddle基础----Tensor表示03importpaddleimportnumpyasnp#Numpy转Tensorx=np.ones([2,3])y=paddle.to_tensor(x)#Tensor转Numpyz=y.numpy()print(z)Tensor转成Numpy(demo/demo3.py)输出结果为:[[1.1.1.][1.1.1.]]PaddlePaddle基础----Tensor计算03importpaddlex=paddle.to_tensor([[1,2],[3,4]])y=paddle.to_tensor([[5,6],[7,8]])z1=x+yprint(z1)加法(demo/demo4.py)输出结果为:Tensor(shape=[2,2],dtype=int64,place=Place(gpu:0),stop_gradient=True,[[6,8],[10,12]])加减乘除z1=paddle.add(x,y)也可以采用如下格式PaddlePaddle基础----Tensor计算03y.add_(x)原地(in-place)操作y.add_(x)是一个原地(in-place)操作,它直接修改张量y,将x加到y上,而不是创建一个新的张量来存储结果,原地操作可以节省内存,因为它们不需要为结果分配新的内存空间。但是,这也意味着你不能在不需要改变原始张量y的情况下使用它,因为它会直接影响y的值。具体来说,y.add_(x)等价于y=y+x,但后者会创建一个新的张量来存储y和x相加的结果,而前者则直接在y上进行修改。加减乘除PaddlePaddle基础----Tensor计算03#减法z2=paddle.subtract(x,y)print(z2)#乘法z3=paddle.multiply(x,y)print(z3)#除法z4=paddle.divide(x,y)print(z4)Tensor之间的减、乘、除方法也类似加减乘除PaddlePaddle基础----Tensor计算03Tensor(shape=[2,2],dtype=int64,place=Place(gpu:0),stop_gradient=True,[[-5,-6],[-7,-8]])Tensor(shape=[2,2],dtype=int64,place=Place(gpu:0),stop_gradient=True,[[6,16],[30,48]])Tensor(shape=[2,2],dtype=int64,place=Place(gpu:0),stop_gradient=True,[[0,0],[0,0]])输出结果为加减乘除这些操作都是基于Tensor元素进行的,如何进行矩阵或向量的乘法呢?PaddlePaddle基础----Tensor计算03importpaddlex=paddle.to_tensor([[1,2],[3,4],[5,6]],dtype="float32")y=paddle.to_tensor([[1,2,3],[4,5,6]],dtype="float32")z=paddle.matmul(x,y)print(z)矩阵乘法(demo/demo5.py)加减乘除输出结果为:Tensor(shape=[3,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[9.,12.,15.],[19.,26.,33.],[29.,40.,51.]])注意:paddle.matmul()函数默认的Tensor元素类型必须是float型PaddlePaddle基础----Tensor计算03importpaddlex=paddle.to_tensor([[-1,-2],[-3,4]],dtype="float32")z1=paddle.abs(x)print(z1)取绝对值(demo/demo6.py)取绝对值和求幂输出结果为:Tensor(shape=[2,2],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[1.,2.],[3.,4.]])PaddlePaddle基础----Tensor计算03z2=paddle.pow(x,3)print(z2)求幂操作取绝对值和求幂输出结果为:Tensor(shape=[2,2],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[-1.,-8.],[-27.,64.]])PaddlePaddle基础----Tensor计算03importpaddlex=paddle.to_tensor([[1,2],[3,4],[5,6]],dtype="float32")y=paddle.to_tensor([1,2,3,4,5,6],dtype="float32")paddle.reshape_(y,[2,3])z=paddle.matmul(x,y)print(z)更改形状(demo/demo7.py)输出结果为:Tensor(shape=[3,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[9.,12.,15.],[19.,26.,33.],[29.,40.,51.]])PaddlePaddle基础----自动求梯度03importpaddleimportnumpyasnpx=np.ones([2,2])*3x=paddle.to_tensor(x,stop_gradient=False)#stop_gradient=False,允许该Tensor计算梯度y=paddle.pow(x,2)y.backward()print((x.grad).numpy())梯度求解示例(demo/demo8.py)PaddlePaddle提供自动求导功能,不需要手动计算梯度,只需要搭建好前向传播的计算图PaddlePaddle基础----自动求梯度03importpaddleimportnumpyasnpx=np.ones([2,2])*3x=paddle.to_tensor(x,stop_gradient=False)y=paddle.pow(x,2)y.backward()print((x.grad).numpy())梯度求解示例(demo/demo8.py)输出结果为:[[6.6.][6.6.]]PaddlePaddle提供自动求导功能,不需要手动计算梯度,只需要搭建好前向传播的计算图PaddlePaddle基础----自动求梯度03importpaddleimportnumpyasnpx=np.ones([2,2])*3x=paddle.to_tensor(x,stop_gradient=False)y=paddle.pow(x,2)y.backward()print((x.grad).numpy())梯度求解示例(demo/demo8.py)输出结果为:[[6.6.][6.6.]]PaddlePaddle提供自动求导功能,不需要手动计算梯度,只需要搭建好前向传播的计算图PaddlePaddle基础----自动求梯度03importpaddleimportnumpyasnpx=np.ones([2,2])*3x=paddle.to_tensor(x,stop_gradient=False)y=paddle.pow(x,2)y.backward()print((x.grad).numpy())梯度求解示例(demo/demo8.py)由于梯度会累加,因此重新计算(y.backward())前需要清零:x.clear_grad()PaddlePaddle提供自动求导功能,不需要手动计算梯度,只需要搭建好前向传播的计算图PART04PaddlePaddle实现机器学习:线性回归投资预测线性回归投资预测----问题定义04根据前面15年的投资与收益关系,预测第16年如果投资12.5万所对应的收益值年份投资(万元)—收益(万元)—13.31724.42835.52146.73256.91764.21679.83486.22697.625102.212117281210.835135.31714829153.1131612.5?pipinstallmatplotlib安装可视化工具库importmatplotlib.pyplotaspltimportnumpyasnp可视化分析代码如下(machine_learning/visual_analysis.py)线性回归投资预测----问题定义04#输入数据x_train=np.array([3.3,4.4,5.5,6.7,6.9,4.2,9.8,6.2,7.6,2.2,7,10.8,5.3,8,3.1],dtype=np.float32,)y_train=np.array([17,28,21,32,17,16,34,26,25,12,28,35,17,29,13],dtype=np.float32)#可视化展示plt.plot(x_train,y_train,"go",label="OriginalData")plt.xlabel("investment")plt.ylabel("income")plt.legend()plt.savefig("analysis.png")可视化分析代码如下(machine_learning/visual_analysis.py)线性回归投资预测----问题定义04通过数据分析可以猜测投资额和收益之间存在线性关系,可以将模型定义为:
线性回归投资预测----导数法04
上面两式联立,可以得到:importmatplotlib.pyplotaspltimportnumpyasnp#输入数据x_train=np.array([3.3,4.4,5.5,6.7,6.9,4.2,9.8,6.2,7.6,2.2,7,10.8,5.3,8,3.1],dtype=np.float32,)y_train=np.array([17,28,21,32,17,16,34,26,25,12,28,35,17,29,13],dtype=np.float32)代码如下(machine_learning/manual_diff.py)线性回归投资预测----导数法04#求解直线方程的a和b参数n=len(x_train)sum_xy=sum(x_train*y_train)sum_x=sum(x_train)sum_y=sum(y_train)sum_x2=sum(pow(x_train,2))a=(n*sum_xy-sum_x*sum_y)/(n*sum_x2-sum_x*sum_x+0.00001)b=(sum_x2*sum_y-sum_x*sum_xy)/(n*sum_x2-sum_x*sum_x+0.00001)代码如下(machine_learning/manual_diff.py)#可视化输出x_pred=np.arange(0,15)y_pred=a*x_pred+bplt.plot(x_train,y_train,"go",label="OriginalData")plt.plot(x_pred,y_pred,"r-",label="FittedLine")plt.xlabel("investment")plt.ylabel("income")plt.legend()plt.savefig("result.png")#预测第16年的收益值x=12.5y=a*x+bprint(y)线性回归投资预测----导数法0440.198289616408566最终预测的收益结果为:如果建立更加复杂的函数,例如引入非线性或多阶函数,那么上述这种方法就很难手工求解了,甚至很多情况下是没有数值解的,这时需要将确定解转化为求解最有解,也是深度学习中主要的求解方法:梯度下降法:梯度下降法允许通过迭代计算来自动逼近函数极小值点线性回归投资预测----梯度下降法04梯度下降法是机器学习领域非常重要和具有代表性的算法,它通过迭代计算来逐步寻找目标函数极小值。双自变量函数梯度下降法示意图线性回归投资预测----梯度下降法04梯度下降法需要计算偏导数,如果函数复杂,工作量很大且容易出错,为此可以借助深度学习框架的自动求导机制:importmatplotlib.pyplotaspltimportnumpyasnpimportpaddle#输入数据x_train=np.array([3.3,4.4,5.5,6.7,6.9,4.2,9.8,6.2,7.6,2.2,7,10.8,5.3,8,3.1],dtype=np.float32,)完整代码如下(machine_learning/auto_diff.py)y_train=np.array([17,28,21,32,17,16,34,26,25,12,28,35,17,29,13],dtype=np.float32)#numpy转tensorx_train=paddle.to_tensor(x_train)y_train=paddle.to_tensor(y_train)#随机初始化模型参数a=np.random.randn(1)a=paddle.to_tensor(a,dtype="float32",stop_gradient=False)b=np.random.randn(1)b=paddle.to_tensor(b,dtype="float32",stop_gradient=False)线性回归投资预测----梯度下降法03#循环迭代fortinrange(10):#计算平方差损失y_=a*x_train+bloss=paddle.sum((y_-y_train)**2)#自动计算梯度loss.backward()#更新参数(梯度下降),学习率默认使用1e-3a=a.detach()-1e-3*float(a.grad)b=b.detach()-1e-3*float(b.grad)a.stop_gradient=Falseb.stop_gradient=False#输出当前轮的目标函数值Lprint("epoch:{},loss:{}".format(t,(float(loss))))#训练结束,终止a和b的梯度计算完整代码如下(machine_learning/auto_diff.py)a.stop_gradient=Trueb.stop_gradient=True#可视化输出x_pred=paddle.arange(0,15)y_pred=a*x_pred+bplt.plot(x_train.numpy(),y_train.numpy(),"go",label="OriginalData")plt.plot(x_pred.numpy(),y_pred.numpy(),"r-",label="FittedLine")plt.xlabel("investment")plt.ylabel("income")plt.legend()plt.savefig("result.png")#预测第16年的收益值x=12.5y=a*x+bprint(y.numpy())线性回归投资预测----梯度下降法04epoch:0,loss:9141.90625epoch:1,loss:1103.665283203125epoch:2,loss:397.5347900390625epoch:3,loss:335.0281982421875epoch:4,loss:329.02337646484375epoch:5,loss:327.982421875epoch:6,loss:327.381103515625epoch:7,loss:326.8223571777344epoch:8,loss:326.2711486816406epoch:9,loss:325.72442626953125[44.96492]训练过程输出结果(machine_learning/auto_diff.py)投资收益损失逐渐减小,函数拟合逐渐收敛PART05PaddlePaddle实现深度学习:自动驾驶小车控制自动驾驶小车控制----卷积神经网络基础05卷积神经网络(ConvolutionNerualNetwork,CNN)是一类特殊的人工神经网络,是深度学习中最重要的一个分支对于形状为32×32×3的图像,如果使用1个卷积滤波器(形状为5×5×3)对其进行卷积可以得到28×28×1的特征图像;如果使用n个同样大小的卷积滤波器,那么就会产生n个28×28×1的特征图,这些特征图合并就组成了28×28×n大小的特征图。可以看到,通过这样的卷积层操作,将原本只有32×32×3大小的输入图像变成了28×28×n大小。自动驾驶小车控制----卷积神经网络基础05PaddlePaddle提供了封装好的二维卷积层函数:Conv2D(),完整定义如下:
in_channels:类型为int,表示输入图像或特征的通道数;
out_channels:类型为int,表示输出特征的通道数;
kernel_size:类型为int、list或tuple,表示卷积核大小;
stride:类型为int、list或tuple,表示步长大小,默认值为1;
padding:类型为int、list、tuple或str,表示边缘扩增大小,默认值为0;dilation:类型为int、list或tuple,表示空洞大小,默认值为1;groups:类型为int,表示二维卷积层的组数,默认值为1;padding_mode:类型为str,表示填充模式,具体模式包括zeros、reflect、replicate、circular,默认值为zeros;weight_attr:类型为ParamAttr,表示使用默认的权重参数属性,默认值为None;bias_attr:类型为ParamAttr或bool,表示使用默认的偏置参数属性,默认值为None;data_format:类型为str,表示输入的数据格式,可以是“NCHW”或“NHWC”,默认值为“NCHW”;N表示批样本数batch_size,C表示特征通道数,H表示特征高度、W表示特征宽度。paddle.nn.Conv2D(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,padding_mode='zeros',weight_attr=None,bias_attr=None,data_format='NCHW')自动驾驶小车控制----卷积神经网络基础05importpaddleimportpaddle.nnasnn#创建输入x=paddle.uniform((2,3,8,8),dtype="float32",min=0.0,max=1.0)#构造卷积层conv=nn.Conv2D(3,6,(5,5))#执行一层卷积y=conv(x)#输出tensor转numpyy_np=y.numpy()print(y_np.shape)使用Conv2D()的一个简单示例(demo/demo9.py)(2,6,4,4)最终输出结果为
out=(8-5+2×0)/1+1=4本例计算为:自动驾驶小车控制----卷积神经网络基础05激活函数层importmatplotlib.pyplotaspltimportpaddle#构造x轴数据x=paddle.linspace(-5,5,200,"float32")#创建sigmoid激活函数层sigmod=paddle.nn.Sigmoid()#执行计算y=sigmod(x)#输出打印plt.plot(x.numpy(),y.numpy(),c="red")plt.savefig("result.png")1+1=4Sigmoid(demo/demo10.py)
Sigmoid函数自动驾驶小车控制----卷积神经网络基础05激活函数层importmatplotlib.pyplotaspltimportpaddle#构造x轴数据x=paddle.linspace(-5,5,200,"float32")#创建ReLU激活函数层relu=paddle.nn.ReLU()#执行计算y=relu(x)#输出打印plt.plot(x.numpy(),y.numpy(),c="red")plt.savefig("result.png")ReLU()
(demo/demo11.py)ReLU函数自动驾驶小车控制----卷积神经网络基础05激活函数层importmatplotlib.pyplotaspltimportpaddle#构造x轴数据x=paddle.linspace(-5,5,200,"float32")#创建ELU激活函数层elu=paddle.nn.ELU()#执行计算y=elu(x)#输出打印plt.plot(x.numpy(),y.numpy(),c="red")plt.savefig("result.png")ELU()
(demo/demo12.py)ELU函数自动驾驶小车控制----卷积神经网络基础05
池化层paddle.nn.MaxPool2D(kernel_size,stride=None,padding=0,ceil_mode=False,return_mask=False,data_format='NCHW',name=None)kernel_size(int|list|tuple):池化核大小。stride(int|list|tuple,可选):池化层的步长,默认为None,这时会使用kernel_size作为stride。padding(str|int|list|tuple,可选):边缘扩增大小,默认为0。ceil_mode(bool,可选):是否用ceil函数计算输出高度和宽度,默认为False。return_mask(bool,可选):是否返回最大索引和输出,默认为False。data_format(str,可选):输入和输出的数据格式,默认值为“NCHW”。name(str,可选):函数的名字,默认为None。自动驾驶小车控制----卷积神经网络基础05importpaddle#构建输入数据input=paddle.uniform([1,3,32,32],dtype="float32",min=-1,max=1)#创建最大池化层maxpool2d=paddle.nn.MaxPool2D(kernel_size=2,stride=2,padding=0)#计算output=maxpool2d(input)#输出print(output.shape)池化层
(demo/demo13.py)输入特征为[1,3,32,32],输出为[1,3,16,16]
池化层paddle.nn.MaxPool2D(kernel_size,stride=None,padding=0,ceil_mode=False,return_mask=False,data_format='NCHW',name=None)自动驾驶小车控制----卷积神经网络基础05线性变换层paddle.nn.Linear(in_features,out_features,weight_attr=None,bias_attr=None,name=None)线性变换层Linear()in_features(int):线性变换层输入单元的数目。out_features(int):线性变换层输出单元的数目。weight_attr(ParamAttr,可选):指定权重参数的属性,默认值为None。bias_attr(ParamAttr|bool,可选):指定偏置参数的属性,默认值为None。name(str,可选):线性变换层名称,一般无需设置,默认值为None。自动驾驶小车控制----卷积神经网络基础05importpaddle#定义线性变换层W和b的初始权重weight_attr=paddle.ParamAttr(name="weight",initializer=paddle.nn.initializer.Constant(value=0.5))bias_attr=paddle.ParamAttr(name="bias",initializer=paddle.nn.initializer.Constant(value=1.0))线性变换层(demo/demo14.py)i#创建线性变换层linear=paddle.nn.Linear(2,4,weight_attr=weight_attr,bias_attr=bias_attr)print("W:")print(linear.weight.numpy())print("b:")print(linear.bias.numpy())#创建输入数据x=paddle.randn((3,2),dtype="float32")print("x:")print(x.numpy())#执行计算y=linear(x)#输出print("y:")print(y.numpy())自动驾驶小车控制----卷积神经网络基础05W:[[0.50.50.50.5][0.50.50.50.5]]b:[1.1.1.1.]x:[[-0.77213407-1.3029497][0.867346-1.1684941][-2.0121474-0.35440806]]y:[[-0.03754187-0.03754187-0.03754187-0.03754187][0.84942590.84942590.84942590.8494259][-0.18327773-0.18327773-0.18327773-0.18327773]]输出结果如下:自动驾驶小车控制----卷积神经网络基础05importpaddle#创建输入数据paddle.seed(102)#固定随机数,使结果可复现x=paddle.randn((3,2),dtype="float32")#构造两个线性变换层myLayer1=paddle.nn.Linear(2,4,bias_attr=True)myLayer2=paddle.nn.Linear(4,5,bias_attr=True)#使用两个线性变换层逐个对x进行计算y1=myLayer1(x)y2=myLayer2(y1)print(y2)#将两个线性变换层组合成新的层,再对x进行计算myLayer3=paddle.nn.Sequential(myLayer1,myLayer2)y3=myLayer3(x)print(y3)Sequential()函数(demo/demo15.py)自动驾驶小车控制----算法原理05由摄像头采集图像,然后将图像输入到预先训练好的CNN网络,这个网络的输出是方向盘的转向角度输入图像首先进行归一化,然后经过5组卷积层处理,最后拉平以后通过多个线性变换层计算得到一个回归值,这个回归值就是所需要的转向角获得训练数据以后,在模型训练阶段,每次迭代时计算模型预测角度与当前图像期望角度的误差,这个误差通过神经网络反向传播来更新模型参数。整个过程一直循环重复,直到误差足够低,这意味着模型已经学会了如何合理地转向,最终模型的输出结果是非常符合人类驾驶经验的。自动驾驶小车控制----数据采集05为了能够采集到每帧图像及对应的最佳转向角度,可以按照1.4节的内容,通过手动操作键盘来控制小车运动,然后记录每帧转向角数据可以使用前面1.4节基于OpenCV的自动驾驶算法来控制小车运行,然后记录每帧图像及对应角度,收集好大量数据以后再来训练深度学习算法importosimportcv2importnumpyasnpimportgymimportgym_donkeycar#导入自定义库fromimg_analysisimportregion_of_interest,average_lines,compute_steer_angle#创建数据集目录folder="./data"ifnotos.path.exists(folder):os.makedirs(folder)#设置模拟器环境env=gym.make("donkey-generated-roads-v0")obv=env.reset()#开始启动,并获取首帧图像action=np.array([0,0.2])#动作控制,第1个转向值,第2个油门值frame,reward,done,info=env.step(action)#运行2000次动作pic_index=len(os.listdir(folder))fortinrange(2000):#高斯滤波去噪frame_g=cv2.GaussianBlur(frame,(5,5),1)#转换图像到HSV空间height,width,_=frame_g.shapehsv=cv2.cvtColor(frame_g,cv2.COLOR_RGB2HSV)自动驾驶小车控制----数据采集05#特定颜色区域检测lower_blue=np.array([15,40,40])upper_blue=np.array([45,255,255])yellow_mask=cv2.inRange(hsv,lower_blue,upper_blue)lower_blue=np.array([0,0,200])upper_blue=np.array([180,30,255])white_mask=cv2.inRange(hsv,lower_blue,upper_blue)#边缘检测yellow_edge=cv2.Canny(yellow_mask,200,400)white_edge=cv2.Canny(white_mask,200,400)#感兴趣区域提取yellow_croped=region_of_interest(yellow_edge,color="yellow")white_croped=region_of_interest(white_edge,color="white")#直线检测rho=1#距离精度:1像素angle=np.pi/180#角度精度:1度min_thr=10#最少投票数white_lines=cv2.HoughLinesP(white_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)yellow_lines=cv2.HoughLinesP(yellow_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)#小线段聚类yellow_lane=average_lines(frame,yellow_lines,direction="left")white_lane=average_lines(frame,white_lines,direction="right")自动驾驶小车控制----数据采集05#计算转向角steering_angle=compute_steer_angle(yellow_lane,white_lane,height,width)print(steering_angle)action=np.array([steering_angle,0.2])#油门值恒定#记录图像和转向角img_path=folder+"/{:d}_{:.4f}.jpg".format(pic_index,steering_angle)frame=cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)cv2.imwrite(img_path,frame)pic_index+=1#执行动作并重新获取图像frame,reward,done,info=env.step(action)#运行结束后重置当前场景obv=env.reset()每次运行都会在data目录下生成2000张图片,由于每次运行的赛道都是随机生成的,因此读者可以多运行几次,最终收集10000张图像,每张图像命名规则为“图像帧号_转向角度.jpg”自动驾驶小车控制----数据采集05importosimportrandomfromtoolsimportcreat_data_list,getFileListorg_img_folder="./data"#数据集根目录train_ratio=0.8#训练集占比#检索jpg文件jpglist=getFileList(org_img_folder,[],"jpg")print("检索到"+str(len(jpglist))+"个jpg文件\n")#解析转向值file_list=list()forjpgpathinjpglist:print(jpgpath)图像路径以及转向角度写入到对应的txt文件curDataDir=os.path.dirname(jpgpath)basename=os.path.basename(jpgpath)angle=(basename[:-4]).split("_")[-1]imgPath=os.path.join(curDataDir,basename).replace("\\","/")file_list.append((imgPath,angle))#切分数据random.seed(256)random.shuffle(file_list)train_num=int(len(file_list)*train_ratio)train_list=file_list[0:train_num]val_list=file_list[train_num:]#创建列表文件creat_data_list(train_list,mode="train")creat_data_list(val_list,mode="val")自动驾驶小车控制----数据采集05./data/4647_-0.1778.jpg-0.1778./data/5989_0.1556.jpg0.1556./data/6386_0.1556.jpg0.1556txt中内容为每一行表示一个样本,由图像路径和转向角度组成,中间用空格分隔。训练集列表train.txt共有8000行,验证集列表val.txt共有2000行自动驾驶小车控制----数据获取05importnumpyasnpimportcv2importpaddleclassAutoDriveDataset(paddle.io.Dataset):"""自定义数据集类"""def__init__(self,mode,transform=None):""":参数mode:'train'或者'val':参数transform:图像预处理方式"""self.mode=mode.lower()self.transform=transformassertself.modein{"train","val"}AutoDriveDataset完整代码(dl_drive/dataset.py)#读取数据集列表文件信息ifself.mode=="train":file_path="./train.txt"else:file_path="./val.txt"self.file_list=list()withopen(file_path,"r")asf:files=f.readlines()forfileinfiles:iffile.strip()isNone:continueself.file_list.append([file.split("")[0],float(file.split("")[1])])自动驾驶小车控制----数据获取05def__getitem__(self,i):""":参数i:图像检索号:返回:返回第i个图像和转向值"""#读取图像img=cv2.imread(self.file_list[i][0])img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#预处理ifself.transform:img=self.transform(img)#读取转向值label=self.file_list[i][1]label=paddle.to_tensor(np.array([label]),dtype="float32")returnimg,labeldef__len__(self):"""返回:图像总数"""returnlen(self.file_list)(1)继承自paddle.io.Dataset类,实现了__getitem__()和__len__()函数。(2)在__init__()函数中,设置了mode参数,使得自定义类可以同时兼顾train(训练)和val(验证)两种不同的模式。(3)__getitem__()函数需要根据传入的检索号来返回对应的图像数据和真值(转向角)。这个函数是必须要实现的函数,并且其传入参数永远是某张图片的列表索引号。(4)__len__()函数中需要返回当前读取的总的图片数量,这个函数是必须要实现的函数。自动驾驶小车控制----数据获取05importnumpyasnpimportcv2importpaddleclassAutoDriveDataset(paddle.io.Dataset):"""自定义数据集类"""def__init__(self,mode,transform=None):""":参数mode:'train'或者'val':参数transform:图像预处理方式"""self.mode=mode.lower()self.transform=transformassertself.modein{"train","val"}AutoDriveDataset完整代码(dl_drive/dataset.py)#读取数据集列表文件信息ifself.mode=="train":file_path="./train.txt"else:file_path="./val.txt"self.file_list=list()withopen(file_path,"r")asf:files=f.readlines()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肿瘤学预防与早期诊断技术
- 医学课件-放射性脊髓病合并肢体瘫痪护理查房
- 生活意义疗法有利于癌症患者的康复
- 医学课件-肝癌分子靶向药物的不良反应评价标准
- 花卉根结线虫病的防治
- 护理程序-护理诊断
- 氟斑牙的危害及防治
- 护理专业人才能力培养新路径
- 脂肪干细胞抗衰老和美容
- 医学影像学新技术在心血管疾病诊断中的应用与挑战
- 2026人教PEP版五年级英语上册 Unit2 My Feelings 知识清单
- 4D性格测试题(完整版+通俗答案解析)
- 2026秋季新教材湘美版小学美术四年级上册(全册)教学设计(附目录)
- 26苏教版四上数学必背知识点(全册)
- 2025年日照信息科技中考考试试题及答案
- 新版教科版四年级上册科学(课件)第2单元 5 口腔里的消化
- 苏教版2026-2027四年级数学上册教学计划及进度
- 老年人误吸的预防护理课件
- 笠翁对韵-拼音及笠翁对韵 A4打印 拼音版
- 《无人机组装与调试》第3章 无人机装配工艺
- 公墓墓碑及道路维修工程施工方案施工组织设计
评论
0/150
提交评论