火车上优于深取样器的运动规划
这个案例展示了如何训练深上优于取样器加速使用sampling-based规划者像RRT路径规划(快速扩展随机树)和RRT *。
RRT等古典sampling-based规划者和RRT *依靠生成样本均匀分布在一个指定的状态空间。然而,这些计划通常限制实际机器人路径状态空间的一小部分。均匀采样使规划师探索许多州不影响最终的路径。这使规划过程变得缓慢而低效的,尤其是对状态空间与大量的维度。
你可以训练一个深学习网络生成学习样本可以偏见朝着最优解决方案。这个例子实现了Ichter等人提出的方法在他们的论文题为“学习机器人运动规划的抽样分布”。这种方法实现了一个有条件的变化Autoencoder (CVAE)生成学习样本对于一个给定的地图,开始状态和目标状态。
学习了概率抽样本身不能保证完整性和渐近最优性,均匀采样。因此,您可以混合学习样本和统一的样品在一定比例λ
偏见,规划师向最优解,同时保证找到解决办法。λ= 0
表明纯均匀采样,λ= 1
表明纯学抽样0 <λ< 1
表示两者的结合。
负载Pretrained网络
从地毯上加载pretrained网络文件CVAESamplerTrainedModel.mat
。使用数据集训练网络MazeMapDataset.mat
。如果你想训练网络,设置doTraining
来真正的
。
doTraining = false;如果~ doTraining负载(“CVAESamplerTrainedModel”,“encoderNet”,“decoderNet”)结束
加载数据集
加载数据集从垫文件MazeMapDataset.mat
。数据集包含2000个迷宫地图和相应的状态开始,目标,和路径。
负载(“MazeMapDataset”,“数据集”,“mapParams”)
数据集生成
生成数据集使用examplerHelperGenerateData
函数。注意,数据集生成了90多分钟的设置中使用的辅助功能。数据集生成所花费的时间为你的系统可能会有所不同。培养不同类型的地图,你可以替换或修改examplerHelperGenerateData
函数。
下面的代码片段的examplerHelperGenerateData
函数显示了生成的地图使用mapMaze
函数。您可以修改的设置mapMaze
函数或代之以不同的地图生成功能。
% %生成地图%设置随机种子rng (“默认”);%的地图numMaps = 2000;%迷宫地图参数mapSize = 10;%地图大小米(假设身高=体重)gridSize = 25;%网格细胞的数量(假设身高=体重)passageWidth = 5;%在细胞wallThickness = 1;%在细胞mapRes = gridSize / mapSize;%地图解决细胞(每米)%生成地图为k = 1: numMaps地图{k} = mapMaze (passageWidth wallThickness,…MapSize = [MapSize, MapSize],…MapResolution = mapRes);结束
下面的代码片段的examplerHelperGenerateData
函数显示开始和目标状态的集合选择问题。
%随机样本两个不同的启动和目标状态startGoalStates = [1 1 0;9 9 0;9日,1,0;1 9 0);
下面的代码片段的examplerHelperGenerateData
函数显示了最优路径生成使用plannerRRTStar
对象。您可以修改设置不同的最优路径。
规划师= plannerRRTStar (stateSpace stateValidator);计划。ContinueAfterGoalReached = true;%优化计划。MaxConnectionDistance = 1;计划。GoalReachedFcn = @examplerHelperCheckIfGoalReached;计划。MaxIterations = 2000;
可视化数据集
图为我= 1:4次要情节(2,2,我)%选择一个随机地图印第安纳州=兰迪(长度(数据集);exampleHelperPlotData(数据集(印第安纳州). map数据集(印第安纳州).startStates数据集.goalStates(印第安纳州),…navPath (stateSpaceSE2数据集(印第安纳州).pathStates));结束
准备培训资料
压缩映射
在真实的场景中,入住率地图可能很大,和地图通常是稀疏的。你可以使用压缩映射到一个紧凑的表示trainAutoencoder
(深度学习工具箱)函数。这有助于训练收敛速度损失的主要网络在训练深入学习网络训练部分。
从地毯上加载pretrained autoencoder模型文件MapsAutoencoder.mat
。
负载(“MazeMapAutoencoder”,“mapsAE”)
的exampleHelperCompressMaps
函数是用来训练autoencoder模型随机迷宫地图。在这个例子中,地图的大小25 25 = 625
是压缩50
。因此,workSpaceSize
被设置为50
在定义CVAE网络设置部分。培养不同的设置,你可以替换或修改exampleHelperCompressMaps
函数。
过程数据集
你需要处理数据集加载到所需的格式培训网络使用exampleHelperProcessData
函数。
数据处理中最关键的一步是确保使用的扩展数据集的范围[0,1]
或[1]
。
地图数据以二进制的形式占用矩阵,它已经在的范围
[0,1]
。正常的位置
X
,Y
的国家[0,1]
除以他们mapSize
参数。规范化方向
θ
来[1]
通过分π
。
使用exampleHelperNormalizeStates
功能正常化状态数据。应该在预测期间,正规化美国数据使用exampleHelperDenormalizeStates
函数。
下一个数据处理步骤是国家样本划分为多个依赖集。选择这些样本集,这样他们很分散。在每个训练步骤,网络将在多个来自这些样本集训练。网络学习代表样本沿着轨迹通过多个发行版的解决方案。
指定依赖集使用的数量numDependentSets
。指定分裂
对应用于训练数据集的一部分。然后用剩下的部分(1-split)
进行评估。
分= 0.9;numDependentSets = 5;[trainCondition, trainStates testCondition testStates] = exampleHelperProcessData(数据集,mapsAE numDependentSets,分裂);
定义网络体系结构
深入学习网络用于生成学习样本在这个例子中是基于CVAE。CVAE的扩展是一个变分Autoencoder (VAE)这是一个生成模型用于基于随机高斯输入生成数据。看到火车变分Autoencoder (VAE)来生成图像(深度学习工具箱)例子知道VAE是如何工作的。CVAE需要一个额外的输入称为“条件”,因此生成的数据从一个条件概率分布。
在这个例子中,“数据生成”对应到学习状态样本。“条件”对应于机器人的工作空间信息(入住率地图),启动状态和目标状态。网络学习的路径的概率分布“州”“条件”的输入条件。
CVAE作品中不同的训练和预测(或部署)阶段:
在训练阶段,编码器的输入状态 、输入条件 ,计算潜在的状态 。吉隆坡(Kullback-Leibler)发散损失在编码器的输出将尝试匹配的分布 与正态分布 。译码器的输入条件 ,潜伏状态 ,计算预测的状态 。译码器的输出的均方损失会使预测的状态 一样的输入状态 。
在预测阶段只使用译码器。正态分布 提供的输入条件 指定的地图,开始,目标,和输入潜伏 。译码器预测sampling-based规划师可以使用的学习样本。您可以查询大量的国家在一个步骤中,这将会更快的GPU。
定义CVAE网络设置
为创建CVAE指定这些设置网络:
的
stateSize
是SE(2)状态向量的大小(X, Y,θ)
。的
workspaceSize
可以是单元值的迷宫地图或压缩表示。在这个例子中,你可以选择更好的压缩表示地图训练收敛。的
latentStateSize
是多元高斯分布的维数。的
conditionSize
是笔workspaceSize
,开始stateSize
和目标stateSize
。
stateSize = 3;workspaceSize = 50;latentStateSize = 4;conditionSize = workspaceSize + 2 * stateSize;
创建CVAE编码器网络
CVAE编码器网络是完全连接的神经网络,由层与ReLU(修正线性单元)激活功能层和辍学层之间。辍学层帮助减少过度拟合,实现更好的泛化。的输入层编码器连接条件
和国家
向量。最后一层的编码器计算潜在的状态向量的平均值和标准偏差
,使用exampleHelperSamplingLayer
函数。
%隐藏编码器完全连接层网络的大小encoderHiddenSizes = (512、512);%的概率值辍学层概率= [0.10,0.01];%创建层encoderLayers = featureInputLayer (numDependentSets * stateSize + conditionSize Name =“encoderInput”);为k = 1:长度(encoderHiddenSizes) encoderLayers结束(+ 1)= fullyConnectedLayer (encoderHiddenSizes (k));% #好< * SAGROW >encoderLayers结束(+ 1)= reluLayer;encoderLayers结束(+ 1)= dropoutLayer(概率(k));结束encoderLayers结束(+ 1)= fullyConnectedLayer (2 * latentStateSize);encoderLayers结束(+ 1)= exampleHelperSamplingLayer (Name =“encoderOutput”);%创建图层图表和dlnetwork对象encoderGraph = layerGraph (encoderLayers);%建立这个网络只有当doTraining = true如果doTraining encoderNet = dlnetwork (encoderGraph);结束
创建CVAE译码器网络
CVAE译码器网络是完全连接的神经网络,由层与ReLU辍学层之间。译码器的输入层的连接条件 和潜在的状态 向量。最后一层的译码器计算预测的状态 。
%隐藏解码器完全连接层网络的大小decoderHiddenSizes = (512 - 512);%的概率值辍学层概率= (0.10 - 0.01);%创建层decoderLayers = featureInputLayer (conditionSize + latentStateSize Name =“decoderInput”);为k = 1:长度(decoderHiddenSizes) decoderLayers结束(+ 1)= fullyConnectedLayer (decoderHiddenSizes (k));% #好< * SAGROW >decoderLayers结束(+ 1)= reluLayer;decoderLayers结束(+ 1)= dropoutLayer(概率(k));结束decoderLayers结束(+ 1)= = fullyConnectedLayer (numDependentSets * stateSize,名称“decoderOutput”);%创建图层图表decoderGraph = layerGraph (decoderLayers);%建立这个网络只有当doTraining = true如果doTraining decoderNet = dlnetwork (decoderGraph);结束
深入学习网络训练
培训方案
指定这些训练方法训练的深度学习网络:
选择=结构;选项。NumEpochs = 100; options.TrainBatchSize = 32; options.LearningRate = 1e-3; options.Beta = 1e-4; options.Weight = [1,1,0.1];
列车网络的
使用exampleHelperTrainCVAESampler功能训练神经网络基于自定义训练循环的概念,明白了自定义训练循环,损失函数和网络(深度学习工具箱)。神经网络训练使用NVIDIA GeForce GPU和8 GB图形内存。100年培训这个网络时代大约11个小时。你的系统的培训时间可能不同。
在这个例子中,提供pretrained模型CVAESamplerTrainedModel.mat
默认加载。火车模型与一个定制的网络和自定义数据集,集doTraining
来真正的
在负载Pretrained网络部分。
如果doTraining%的再现性rng (“默认”)%创建mini-batch队列训练trainData =结合(arrayDatastore (trainCondition) arrayDatastore (trainStates));mbqTrain = minibatchqueue (trainData MiniBatchSize = options.TrainBatchSize,…OutputAsDlarray = [1], MiniBatchFormat = {“公元前”,“公元前”});%火车CVAE取样器模型图(Name =“培训损失”);[encoderNet, decoderNet] = exampleHelperTrainCVAESampler (encoderNet decoderNet,…@lossCVAESampler mbqTrain,…选项);结束
预测使用新数据
使用训练网络生成学习样本数据集的一部分用于预测。在过程数据集节中,设置分裂
来0.9
,所以你有10%的预测数据集。
准备测试集
%的再现性rng (“默认”)%准备测试mini-batchestestData =结合(arrayDatastore (testCondition) arrayDatastore (testStates));mbqTest = minibatchqueue (testData MiniBatchSize = 1,…OutputAsDlarray = [1], MiniBatchFormat = {“公元前”,“平衡计分卡”});洗牌(mbqTest)
产生学习样本
使用exampleHelperGenerateLearnedSamples函数生成学习样本。按下运行
下面的按钮来生成学习样本对不同地图在每个时间。你可以调整λ
价值可视化学习样本的结合和统一的样本。
%按运行按钮为新地图可视化结果%不同λ可视化结果为不同比例的总样本学习样本λ=1;%生成样本的数量numSamples = 2000;如果~ hasdata (mbqTest)重置(mbqTest)结束%为不同的测试地图生成样本图(Name =“预测”);为k = 1:4 (mapMatrix、启动目标,statesLearned) = exampleHelperGenerateLearnedSamples (encoderNet,…decoderNet、mapsAE mbqTest numDependentSets,…mapParams.mapSize numSamples,λ);%可视化的样品地图= binaryOccupancyMap (mapMatrix mapParams.mapRes);次要情节(2 2 k) exampleHelperPlotData(地图,开始,目标,statesLearned);结束
结论
这个例子展示了如何培养深入学习网络生成学习样本等sampling-based规划者RRT和RRT *。它还显示了数据生成过程,深入学习网络设置,培训和预测。您可以修改这个示例中使用自定义地图和自定义数据集。此外,您可以扩展这个应用程序像机械臂路径规划,3 d无人机路径规划等等。
增加sampling-based规划者与深度上优于取样器有效地找到最优路径,明白了加速运动规划与Deep-Learning-Based取样器的例子。
金宝app支持功能
损失函数模型
使用lossCVAESampler
功能训练的深入学习网络深入学习网络训练部分。损失函数由两部分组成:定义网络体系结构节描述了KL发散损失和均方。火车变分Autoencoder (VAE)来生成图像(深度学习工具箱)还描述了这些损失的例子。
函数[损失,gradientsEncoder, gradientsDecoder] = lossCVAESampler (encoderNet、decoderNet条件、状态、β,重量)% lossCVAESampler定义CVAE网络的损失从编码器%预测潜伏状态[z, zMean, zLogVarSq] =前进(encoderNet, vertcat(状态、条件));%预测状态译码器向前statePred = (decoderNet vertcat(条件,z));% % KL diveregence损失klloss = exp (zLogVarSq) + zMean。^ 2 - zLogVarSq 1;%减少zdim求和klloss = (klloss, 1)之和;%减少意味着在批处理klloss =意味着(klloss);%权重对KL损失kllossβ= klloss *;% %重建损失reconLoss = (state-statePred) ^ 2;%权向量应用到状态向量numSets =长度尺寸(reconLoss 1) /(重量);重量= repmat(重量numSets 1);reconLoss = reconLoss。*重量;%减少意味着在批次reconloss =意味着(reconloss, 1);%减少意味着对状态向量维度reconloss =意味着(reconloss);%全损损失= klloss + reconloss;%梯度[gradientsEncoder, gradientsDecoder] = dlgradient(损失,encoderNet.Learnables decoderNet.Learnables);%将损失转换成双=双重损失(损失);结束
参考书目
Ichter,布莱恩,詹姆斯哈里森,马可Pavone。“学习机器人运动规划的抽样分布。“2018年IEEE机器人与自动化国际会议上)举行(“国际机器人与自动化会议”,7087 - 94。布里斯班昆士兰:IEEE 2018。https://doi.org/10.1109/ICRA.2018.8460730。